home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / term-source.lha / termARexxAttributes.c < prev    next >
C/C++ Source or Header  |  1995-09-26  |  88KB  |  4,808 lines

  1. /*
  2. **    termARexxAttributes.c
  3. **
  4. **    ARexx interface attribute handling routines
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termARexxGlobal.h"
  11. #include "termARexxAttributes.h"
  12.  
  13.     /* ToBoolean(WORD Value):
  14.      *
  15.      *    Map an index value to a boolean string.
  16.      */
  17.  
  18. STATIC STRPTR __regargs
  19. ToBoolean(WORD Value)
  20. {
  21.     if(Value)
  22.         return("ON");
  23.     else
  24.         return("OFF");
  25. }
  26.  
  27.     /* FromBoolean(STRPTR Value):
  28.      *
  29.      *    Map a boolean value to an index value.
  30.      */
  31.  
  32. STATIC WORD __regargs
  33. FromBoolean(STRPTR Value)
  34. {
  35.     STATIC STRPTR BoolTrueMappings[] =
  36.     {
  37.         "TRUE",
  38.         "ON",
  39.         "YES",
  40.         "ENABLED",
  41.         "AVAILABLE",
  42.         NULL
  43.     };
  44.  
  45.     WORD i = 0;
  46.  
  47.     while(BoolTrueMappings[i])
  48.     {
  49.         if(!Stricmp(Value,BoolTrueMappings[i]))
  50.             return(TRUE);
  51.         else
  52.             i++;
  53.     }
  54.  
  55.     return(FALSE);
  56. }
  57.  
  58.     /* ToMap(WORD Index,STRPTR *Mappings):
  59.      *
  60.      *    Map an index to a string.
  61.      */
  62.  
  63. STATIC STRPTR __regargs
  64. ToMap(WORD Index,STRPTR *Mappings)
  65. {
  66.     WORD i = 0;
  67.  
  68.     while(Mappings[i])
  69.     {
  70.         if(Index == i)
  71.             return(Mappings[i]);
  72.         else
  73.             i++;
  74.     }
  75.  
  76.     return(Mappings[0]);
  77. }
  78.  
  79.     /* FromMap(STRPTR String,STRPTR *Mappings):
  80.      *
  81.      *    Map a string to an index number.
  82.      */
  83.  
  84. STATIC WORD __regargs
  85. FromMap(STRPTR String,STRPTR *Mappings)
  86. {
  87.     WORD i = 0;
  88.  
  89.     while(Mappings[i])
  90.     {
  91.         if(!Stricmp(String,Mappings[i]))
  92.             return(i);
  93.         else
  94.             i++;
  95.     }
  96.  
  97.     return(-1);
  98. }
  99.  
  100.     /* ToIndex(STRPTR Name,WORD *Count1,WORD *Count2):
  101.      *
  102.      *    Turn an index name into an index and count key.
  103.      */
  104.  
  105. STATIC WORD __regargs
  106. ToIndex(STRPTR Name,WORD *Count1,WORD *Count2)
  107. {
  108.     UBYTE    NodeName[40];
  109.     WORD    i,Level = 0,Top = 0,Index = -1;
  110.     BYTE    FoundIt = FALSE,
  111.         NodeIsNumeric;
  112.  
  113.         /* Reset counter variables. */
  114.  
  115.     *Count1 = *Count2 = -1;
  116.  
  117.         /* Skip leading blank spaces. */
  118.  
  119.     while(*Name == ' ' || *Name == '\t')
  120.         Name++;
  121.  
  122.         /* Scan until end of string found. */
  123.  
  124.     while(*Name)
  125.     {
  126.             /* Get the node name. */
  127.  
  128.         i = 0;
  129.  
  130.         while(*Name != '.' && *Name != ' ' && *Name != '\t' && *Name)
  131.             NodeName[i++] = *Name++;
  132.  
  133.         NodeName[i] = 0;
  134.  
  135.             /* Is the name really a number? */
  136.  
  137.         NodeIsNumeric = IsNumeric(NodeName);
  138.  
  139.             /* Skip any trailing spaces. */
  140.  
  141.         while(*Name == ' ' || *Name == '\t')
  142.             Name++;
  143.  
  144.             /* Is a component name to follow? */
  145.  
  146.         if(*Name == '.')
  147.         {
  148.                 /* Skip dot and trailing spaces. */
  149.  
  150.             do
  151.                 Name++;
  152.             while(*Name == ' ' || *Name == '\t');
  153.         }
  154.         else
  155.             Name = "";    /* Last iteration. */
  156.  
  157.             /* Try to find the corresponding keyword in the tree. */
  158.  
  159.         FoundIt = FALSE;
  160.  
  161.         for(i = Top ; i < AttributeTableSize ; i++)
  162.         {
  163.                 /* Is it on the same tree level? Note: code will
  164.                  * scan into the branches but will not move back up
  165.                  * in the tree.
  166.                  */
  167.  
  168.             if(AttributeTable[i] . Level == Level)
  169.             {
  170.                     /* Is a keyword required? */
  171.  
  172.                 if(AttributeTable[i] . Name)
  173.                 {
  174.                         /* Does the name match? */
  175.  
  176.                     if(!Stricmp(AttributeTable[i] . Name,NodeName))
  177.                     {
  178.                             /* Remember new anchor point. */
  179.  
  180.                         Index    = i;
  181.                         Top    = i + 1;
  182.  
  183.                         FoundIt = TRUE;
  184.  
  185.                         break;
  186.                     }
  187.                 }
  188.                 else
  189.                 {
  190.                         /* Is the name really a number? */
  191.  
  192.                     if(NodeIsNumeric)
  193.                     {
  194.                             /* Store the counter. */
  195.  
  196.                         if(*Count1 == -1)
  197.                             *Count2 = Atol(NodeName);
  198.                         else
  199.                             *Count1 = Atol(NodeName);
  200.  
  201.                             /* Remember new anchor point. */
  202.  
  203.                         Index    = i;
  204.                         Top    = i + 1;
  205.  
  206.                         FoundIt = TRUE;
  207.  
  208.                         break;
  209.                     }
  210.                 }
  211.             }
  212.             else
  213.             {
  214.                     /* Don't move back up in the tree! */
  215.  
  216.                 if(AttributeTable[i] . Level < Level)
  217.                     break;
  218.             }
  219.         }
  220.  
  221.         if(FoundIt)
  222.             Level++;
  223.         else
  224.             break;
  225.     }
  226.  
  227.         /* In case the last entry was found, return the index. */
  228.  
  229.     if(FoundIt)
  230.         return(Index);
  231.     else
  232.         return(-1);
  233. }
  234.  
  235.     /* FromIndex(WORD Index,WORD Count1,WORD Count2):
  236.      *
  237.      *    Turn an index/count key into a neat index name.
  238.      */
  239.  
  240. STATIC STRPTR __regargs
  241. FromIndex(WORD Index,WORD Count1,WORD Count2,BYTE IncludeRoot)
  242. {
  243.     STATIC UBYTE __far NameBuffer[160];
  244.  
  245.     WORD Levels[4],i;
  246.  
  247.         /* Reset the level indices. */
  248.  
  249.     for(i = 1 ; i < 4 ; i++)
  250.         Levels[i] = -1;
  251.  
  252.         /* Fill in the leaf level. */
  253.  
  254.     Levels[0] = Index;
  255.  
  256.         /* Top node? */
  257.  
  258.     if(Index > 0)
  259.     {
  260.         WORD Count = 1,Level = AttributeTable[Index] . Level;
  261.  
  262.             /* Move up in the tree. */
  263.  
  264.         for(i = Index - 1 ; i >= 0 ; i--)
  265.         {
  266.                 /* Previous level? */
  267.  
  268.             if(AttributeTable[i] . Level == Level - 1)
  269.             {
  270.                     /* Store index. */
  271.  
  272.                 Levels[Count++] = i;
  273.  
  274.                 Level--;
  275.             }
  276.         }
  277.     }
  278.  
  279.         /* Clear name buffer. */
  280.  
  281.     NameBuffer[0] = 0;
  282.  
  283.         /* Scan backwards. */
  284.  
  285.     for(i = 3 ; i >= 0 ; i--)
  286.     {
  287.             /* Valid level index? */
  288.  
  289.         if(Levels[i] != -1)
  290.         {
  291.                 /* First name? */
  292.  
  293.             if(!NameBuffer[0])
  294.                 strcpy(NameBuffer,AttributeTable[Levels[i]] . Name);
  295.             else
  296.             {
  297.                     /* Valid name string? */
  298.  
  299.                 if(AttributeTable[Levels[i]] . Name)
  300.                 {
  301.                     strcat(NameBuffer,".");
  302.                     strcat(NameBuffer,AttributeTable[Levels[i]] . Name);
  303.                 }
  304.                 else
  305.                 {
  306.                     UBYTE Number[20];
  307.  
  308.                         /* Add an index number. */
  309.  
  310.                     if(Count1 != -1)
  311.                     {
  312.                         SPrintf(Number,".%ld",Count1);
  313.  
  314.                         Count1 = -1;
  315.                     }
  316.                     else
  317.                         SPrintf(Number,".%ld",Count2);
  318.  
  319.                     strcat(NameBuffer,Number);
  320.                 }
  321.             }
  322.         }
  323.     }
  324.  
  325.         /* Return the name string. */
  326.  
  327.     if(IncludeRoot)
  328.         return(NameBuffer);
  329.     else
  330.     {
  331.         STRPTR Name = NameBuffer;
  332.  
  333.         while(*Name++ != '.');
  334.  
  335.         return(Name);
  336.     }
  337. }
  338.  
  339.     /* GetSingleAttribute(WORD ID,WORD Index,WORD Count1,STRPTR Input):
  340.      *
  341.      *    Beware the MONSTER!
  342.      */
  343.  
  344. STATIC LONG __regargs
  345. GetSingleAttribute(WORD ID,WORD Index,WORD Count1,STRPTR *Result)
  346. {
  347.     STATIC UBYTE __far ResultBuffer[MAXPUBSCREENNAME + 1];
  348.  
  349.     STRPTR    String;
  350.     LONG    Number,Error = 0;
  351.  
  352.     switch(ID)
  353.     {
  354.         case ATTR_APPLICATION_VERSION:
  355.  
  356.             SPrintf(ResultBuffer,"%ld.%ld",TermVersion,TermRevision);
  357.  
  358.             String = ResultBuffer;
  359.  
  360.             break;
  361.  
  362.         case ATTR_APPLICATION_SCREEN:
  363.  
  364.             if(GetPubScreenName(Window -> WScreen,ResultBuffer))
  365.                 String = ResultBuffer;
  366.             else
  367.                 Error = ERROR_OBJECT_NOT_FOUND;
  368.  
  369.             break;
  370.  
  371.         case ATTR_APPLICATION_SESSION_ONLINE:
  372.  
  373.             Number = Online;
  374.             break;
  375.  
  376.         case ATTR_APPLICATION_SESSION_SESSIONSTART:
  377.  
  378.             if(!FormatStamp(&SessionStart,NULL,NULL,ResultBuffer,FALSE))
  379.                 strcpy(ResultBuffer,"-");
  380.  
  381.             String = ResultBuffer;
  382.  
  383.             break;
  384.  
  385.         case ATTR_APPLICATION_SESSION_BYTESSENT:
  386.  
  387.             Number = BytesOut;
  388.             break;
  389.  
  390.         case ATTR_APPLICATION_SESSION_BYTESRECEIVED:
  391.  
  392.             Number = BytesIn;
  393.             break;
  394.  
  395.         case ATTR_APPLICATION_SESSION_CONNECTMESSAGE:
  396.  
  397.             String = BaudBuffer;
  398.             break;
  399.  
  400.         case ATTR_APPLICATION_SESSION_BBSNAME:
  401.  
  402.             String = CurrentBBSName;
  403.             break;
  404.  
  405.         case ATTR_APPLICATION_SESSION_BBSNUMBER:
  406.  
  407.             String = CurrentBBSNumber;
  408.             break;
  409.  
  410.         case ATTR_APPLICATION_SESSION_BBSCOMMENT:
  411.  
  412.             String = CurrentBBSComment;
  413.             break;
  414.  
  415.         case ATTR_APPLICATION_SESSION_USERNAME:
  416.  
  417.             String = UserName;
  418.             break;
  419.  
  420.         case ATTR_APPLICATION_SESSION_ONLINEMINUTES:
  421.  
  422.             Number = OnlineMinutes;
  423.             break;
  424.  
  425.         case ATTR_APPLICATION_SESSION_ONLINECOST:
  426.  
  427.             Number = CurrentPay;
  428.             break;
  429.  
  430.         case ATTR_APPLICATION_AREXX:
  431.  
  432.             String = RexxPortName;
  433.             break;
  434.  
  435.         case ATTR_APPLICATION_LASTERROR:
  436.  
  437.             Number = LastRexxError;
  438.             break;
  439.  
  440.         case ATTR_APPLICATION_TERMINAL_ROWS:
  441.  
  442.             if(XEmulatorBase && XEM_IO)
  443.             {
  444.                 if(XEmulatorBase -> lib_Version >= 4)
  445.                 {
  446.                     ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  447.  
  448.                     Number = XEMI_EXTRACT_LINES(Result);
  449.                 }
  450.                 else
  451.                     Number = 0;
  452.             }
  453.             else
  454.                 Number = LastLine + 1;
  455.  
  456.             break;
  457.  
  458.         case ATTR_APPLICATION_TERMINAL_COLUMNS:
  459.  
  460.             if(XEmulatorBase && XEM_IO)
  461.             {
  462.                 if(XEmulatorBase -> lib_Version >= 4)
  463.                 {
  464.                     ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  465.  
  466.                     Number = XEMI_EXTRACT_COLUMNS(Result);
  467.                 }
  468.                 else
  469.                     Number = 0;
  470.             }
  471.             else
  472.                 Number = LastColumn + 1;
  473.  
  474.             break;
  475.  
  476.         case ATTR_APPLICATION_BUFFER_SIZE:
  477.  
  478.             Number = BufferSpace;
  479.             break;
  480.  
  481.         case ATTR_PREFS_SERIAL_BAUDRATE:
  482.  
  483.             Number = Config -> SerialConfig -> BaudRate;
  484.             break;
  485.  
  486.         case ATTR_PREFS_SERIAL_USE_OWNDEVUNIT:
  487.  
  488.             Number = Config -> SerialConfig -> UseOwnDevUnit;
  489.             break;
  490.  
  491.         case ATTR_PREFS_SERIAL_DIRECT_CONNECTION:
  492.  
  493.             Number = Config -> SerialConfig -> DirectConnection;
  494.             break;
  495.  
  496.         case ATTR_PREFS_SERIAL_BREAKLENGTH:
  497.  
  498.             Number = Config -> SerialConfig -> BreakLength;
  499.             break;
  500.  
  501.         case ATTR_PREFS_SERIAL_BUFFERSIZE:
  502.  
  503.             Number = Config -> SerialConfig -> SerialBufferSize;
  504.             break;
  505.  
  506.         case ATTR_PREFS_SERIAL_QUANTUM:
  507.  
  508.             Number = Config -> SerialConfig -> Quantum;
  509.             break;
  510.  
  511.         case ATTR_PREFS_SERIAL_DEVICENAME:
  512.  
  513.             String = Config -> SerialConfig -> SerialDevice;
  514.             break;
  515.  
  516.         case ATTR_PREFS_SERIAL_UNIT:
  517.  
  518.             Number = Config -> SerialConfig -> UnitNumber;
  519.             break;
  520.  
  521.         case ATTR_PREFS_SERIAL_BITSPERCHAR:
  522.  
  523.             Number = Config -> SerialConfig -> BitsPerChar;
  524.             break;
  525.  
  526.         case ATTR_PREFS_SERIAL_PARITYMODE:
  527.  
  528.             Number = Config -> SerialConfig -> Parity;
  529.             break;
  530.  
  531.         case ATTR_PREFS_SERIAL_STOPBITS:
  532.  
  533.             Number = Config -> SerialConfig -> StopBits;
  534.             break;
  535.  
  536.         case ATTR_PREFS_SERIAL_HANDSHAKINGMODE:
  537.  
  538.             Number = Config -> SerialConfig -> HandshakingProtocol;
  539.             break;
  540.  
  541.         case ATTR_PREFS_SERIAL_DUPLEXMODE:
  542.  
  543.             Number = Config -> SerialConfig -> Duplex;
  544.             break;
  545.  
  546.         case ATTR_PREFS_SERIAL_XONXOFF:
  547.  
  548.             Number = Config -> SerialConfig -> xONxOFF;
  549.             break;
  550.  
  551.         case ATTR_PREFS_SERIAL_HIGHSPEED:
  552.  
  553.             Number = Config -> SerialConfig -> HighSpeed;
  554.             break;
  555.  
  556.         case ATTR_PREFS_SERIAL_SHARED:
  557.  
  558.             Number = Config -> SerialConfig -> Shared;
  559.             break;
  560.  
  561.         case ATTR_PREFS_SERIAL_STRIPBIT8:
  562.  
  563.             Number = Config -> SerialConfig -> StripBit8;
  564.             break;
  565.  
  566.         case ATTR_PREFS_SERIAL_CARRIERCHECK:
  567.  
  568.             Number = Config -> SerialConfig -> CheckCarrier;
  569.             break;
  570.  
  571.         case ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH:
  572.  
  573.             Number = Config -> SerialConfig -> PassThrough;
  574.             break;
  575.  
  576.         case ATTR_PREFS_SERIAL_OWNDEVUNIT_REQUEST:
  577.  
  578.             Number = Config -> SerialConfig -> SatisfyODURequests;
  579.             break;
  580.  
  581.         case ATTR_PREFS_MODEM_DIAL_MODE:
  582.  
  583.             Number = Config -> ModemConfig -> DialMode;
  584.             break;
  585.  
  586.         case ATTR_PREFS_MODEM_PBX_MODE:
  587.  
  588.             Number = Config -> ModemConfig -> PBX_Mode;
  589.             break;
  590.  
  591.         case ATTR_PREFS_MODEM_DO_NOT_SEND_COMMANDS:
  592.  
  593.             Number = Config -> ModemConfig -> DoNotSendMainModemCommands;
  594.             break;
  595.  
  596.         case ATTR_PREFS_MODEM_CHAR_SEND_DELAY:
  597.  
  598.             Number = Config -> ModemConfig -> CharSendDelay;
  599.             break;
  600.  
  601.         case ATTR_PREFS_MODEM_MODEMINITTEXT:
  602.  
  603.             String = Config -> ModemConfig -> ModemInit;
  604.             break;
  605.  
  606.         case ATTR_PREFS_MODEM_PBX_PREFIX:
  607.  
  608.             String = Config -> ModemConfig -> PBX_Prefix;
  609.             break;
  610.  
  611.         case ATTR_PREFS_MODEM_MODEMEXITTEXT:
  612.  
  613.             String = Config -> ModemConfig -> ModemExit;
  614.             break;
  615.  
  616.         case ATTR_PREFS_MODEM_MODEMHANGUPTEXT:
  617.  
  618.             String = Config -> ModemConfig -> ModemHangup;
  619.             break;
  620.  
  621.         case ATTR_PREFS_MODEM_DIALPREFIXTEXT:
  622.  
  623.             String = Config -> ModemConfig -> DialPrefix;
  624.             break;
  625.  
  626.         case ATTR_PREFS_MODEM_DIALSUFFIXTEXT:
  627.  
  628.             String = Config -> ModemConfig -> DialSuffix;
  629.             break;
  630.  
  631.         case ATTR_PREFS_MODEM_NOCARRIERTEXT:
  632.  
  633.             String = Config -> ModemConfig -> NoCarrier;
  634.             break;
  635.  
  636.         case ATTR_PREFS_MODEM_NODIALTONETEXT:
  637.  
  638.             String = Config -> ModemConfig -> NoDialTone;
  639.             break;
  640.  
  641.         case ATTR_PREFS_MODEM_CONNECTTEXT:
  642.  
  643.             String = Config -> ModemConfig -> Connect;
  644.             break;
  645.  
  646.         case ATTR_PREFS_MODEM_VOICETEXT:
  647.  
  648.             String = Config -> ModemConfig -> Voice;
  649.             break;
  650.  
  651.         case ATTR_PREFS_MODEM_RINGTEXT:
  652.  
  653.             String = Config -> ModemConfig -> Ring;
  654.             break;
  655.  
  656.         case ATTR_PREFS_MODEM_BUSYTEXT:
  657.  
  658.             String = Config -> ModemConfig -> Busy;
  659.             break;
  660.  
  661.         case ATTR_PREFS_MODEM_OKTEXT:
  662.  
  663.             String = Config -> ModemConfig -> Ok;
  664.             break;
  665.  
  666.         case ATTR_PREFS_MODEM_ERRORTEXT:
  667.  
  668.             String = Config -> ModemConfig -> Error;
  669.             break;
  670.  
  671.         case ATTR_PREFS_MODEM_REDIALDELAY:
  672.  
  673.             Number = Config -> ModemConfig -> RedialDelay;
  674.             break;
  675.  
  676.         case ATTR_PREFS_MODEM_DIALRETRIES:
  677.  
  678.             Number = Config -> ModemConfig -> DialRetries;
  679.             break;
  680.  
  681.         case ATTR_PREFS_MODEM_DIALTIMEOUT:
  682.  
  683.             Number = Config -> ModemConfig -> DialTimeout;
  684.             break;
  685.  
  686.         case ATTR_PREFS_MODEM_INTER_DIAL_DELAY:
  687.  
  688.             Number = Config -> ModemConfig -> InterDialDelay;
  689.             break;
  690.  
  691.         case ATTR_PREFS_MODEM_CONNECTAUTOBAUD:
  692.  
  693.             Number = Config -> ModemConfig -> ConnectAutoBaud;
  694.             break;
  695.  
  696.         case ATTR_PREFS_MODEM_HANGUPDROPSDTR:
  697.  
  698.             Number = Config -> ModemConfig -> DropDTR;
  699.             break;
  700.  
  701.         case ATTR_PREFS_MODEM_REDIALAFTERHANGUP:
  702.  
  703.             Number = Config -> ModemConfig -> RedialAfterHangup;
  704.             break;
  705.  
  706.         case ATTR_PREFS_MODEM_VERBOSEDIALING:
  707.  
  708.             Number = Config -> ModemConfig -> VerboseDialing;
  709.             break;
  710.  
  711.         case ATTR_PREFS_MODEM_NOCARRIERISBUSY:
  712.  
  713.             Number = Config -> ModemConfig -> NoCarrierIsBusy;
  714.             break;
  715.  
  716.         case ATTR_PREFS_MODEM_CONNECTLIMIT:
  717.  
  718.             Number = Config -> ModemConfig -> ConnectLimit;
  719.             break;
  720.  
  721.         case ATTR_PREFS_MODEM_CONNECTLIMITMACRO:
  722.  
  723.             String = Config -> ModemConfig -> ConnectLimitMacro;
  724.             break;
  725.  
  726.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_ONLINE:
  727.  
  728.             Number = Config -> SerialConfig -> ReleaseODUWhenOnline;
  729.             break;
  730.  
  731.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_DIALING:
  732.  
  733.             Number = Config -> SerialConfig -> ReleaseODUWhenDialing;
  734.             break;
  735.  
  736.         case ATTR_PREFS_SERIAL_NO_ODU_IF_SHARED:
  737.  
  738.             Number = Config -> SerialConfig -> NoODUIfShared;
  739.             break;
  740.  
  741.         case ATTR_PREFS_MODEM_TIME_TO_CONNECT:
  742.  
  743.             Number = Config -> ModemConfig -> TimeToConnect;
  744.             break;
  745.  
  746.         case ATTR_PREFS_COMMANDS_STARTUPMACROTEXT:
  747.  
  748.             String = Config -> CommandConfig -> StartupMacro;
  749.             break;
  750.  
  751.         case ATTR_PREFS_COMMANDS_LOGINMACROTEXT:
  752.  
  753.             String = Config -> CommandConfig -> LoginMacro;
  754.             break;
  755.  
  756.         case ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT:
  757.  
  758.             String = Config -> CommandConfig -> LogoffMacro;
  759.             break;
  760.  
  761.         case ATTR_PREFS_COMMANDS_UPLOADMACROTEXT:
  762.  
  763.             String = Config -> CommandConfig -> UploadMacro;
  764.             break;
  765.  
  766.         case ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT:
  767.  
  768.             String = Config -> CommandConfig -> DownloadMacro;
  769.             break;
  770.  
  771.         case ATTR_PREFS_SCREEN_COLOURMODE:
  772.  
  773.             Number = Config -> ScreenConfig -> ColourMode;
  774.             break;
  775.  
  776.         case ATTR_PREFS_SCREEN_USEPENS:
  777.  
  778.             Number = Config -> ScreenConfig -> UsePens;
  779.             break;
  780.  
  781.         case ATTR_PREFS_SCREEN_WINDOW_BORDER:
  782.  
  783.             Number = Config -> ScreenConfig -> ShareScreen;
  784.             break;
  785.  
  786.         case ATTR_PREFS_SCREEN_SPLIT_STATUS:
  787.  
  788.             Number = Config -> ScreenConfig -> SplitStatus;
  789.             break;
  790.  
  791.         case ATTR_PREFS_SCREEN_FONTNAME:
  792.  
  793.             String = Config -> ScreenConfig -> FontName;
  794.             break;
  795.  
  796.         case ATTR_PREFS_SCREEN_FONTSIZE:
  797.  
  798.             Number = Config -> ScreenConfig -> FontHeight;
  799.             break;
  800.  
  801.         case ATTR_PREFS_SCREEN_MAKESCREENPUBLIC:
  802.  
  803.             Number = Config -> ScreenConfig -> MakeScreenPublic;
  804.             break;
  805.  
  806.         case ATTR_PREFS_SCREEN_SHANGHAIWINDOWS:
  807.  
  808.             Number = Config -> ScreenConfig -> ShanghaiWindows;
  809.             break;
  810.  
  811.         case ATTR_PREFS_SCREEN_BLINKING:
  812.  
  813.             Number = Config -> ScreenConfig -> Blinking;
  814.             break;
  815.  
  816.         case ATTR_PREFS_SCREEN_FASTERLAYOUT:
  817.  
  818.             Number = Config -> ScreenConfig -> FasterLayout;
  819.             break;
  820.  
  821.         case ATTR_PREFS_SCREEN_TITLEBAR:
  822.  
  823.             Number = Config -> ScreenConfig -> TitleBar;
  824.             break;
  825.  
  826.         case ATTR_PREFS_SCREEN_STATUSLINEMODE:
  827.  
  828.             Number = Config -> ScreenConfig -> StatusLine;
  829.             break;
  830.  
  831.         case ATTR_PREFS_SCREEN_USEWORKBENCH:
  832.  
  833.             Number = Config -> ScreenConfig -> UseWorkbench;
  834.             break;
  835.  
  836.         case ATTR_PREFS_SCREEN_PUBSCREENNAME:
  837.  
  838.             String = Config -> ScreenConfig -> PubScreenName;
  839.             break;
  840.  
  841.         case ATTR_PREFS_SCREEN_ONLINEDISPLAY:
  842.  
  843.             Number = Config -> ScreenConfig -> TimeMode;
  844.             break;
  845.  
  846.         case ATTR_PREFS_TERMINAL_BELLMODE:
  847.  
  848.             Number = Config -> TerminalConfig -> BellMode;
  849.             break;
  850.  
  851.         case ATTR_PREFS_TERMINAL_USETERMINALPROCESS:
  852.  
  853.             Number = Config -> TerminalConfig -> UseTerminalTask;
  854.             break;
  855.  
  856.         case ATTR_PREFS_TERMINAL_EMULATIONMODE:
  857.  
  858.             Number = Config -> TerminalConfig -> EmulationMode;
  859.             break;
  860.  
  861.         case ATTR_PREFS_TERMINAL_FONTMODE:
  862.  
  863.             Number = Config -> TerminalConfig -> FontMode;
  864.             break;
  865.  
  866.         case ATTR_PREFS_TERMINAL_SENDCRMODE:
  867.  
  868.             Number = Config -> TerminalConfig -> SendCR;
  869.             break;
  870.  
  871.         case ATTR_PREFS_TERMINAL_SENDLFMODE:
  872.  
  873.             Number = Config -> TerminalConfig -> SendLF;
  874.             break;
  875.  
  876.         case ATTR_PREFS_TERMINAL_RECEIVECRMODE:
  877.  
  878.             Number = Config -> TerminalConfig -> ReceiveCR;
  879.             break;
  880.  
  881.         case ATTR_PREFS_TERMINAL_RECEIVELFMODE:
  882.  
  883.             Number = Config -> TerminalConfig -> ReceiveLF;
  884.             break;
  885.  
  886.         case ATTR_PREFS_TERMINAL_NUMCOLUMNS:
  887.  
  888.             Number = Config -> TerminalConfig -> NumColumns;
  889.             break;
  890.  
  891.         case ATTR_PREFS_TERMINAL_NUMLINES:
  892.  
  893.             Number = Config -> TerminalConfig -> NumLines;
  894.             break;
  895.  
  896.         case ATTR_PREFS_TERMINAL_KEYMAPNAME:
  897.  
  898.             String = Config -> TerminalConfig -> KeyMapFileName;
  899.             break;
  900.  
  901.         case ATTR_PREFS_TERMINAL_EMULATIONNAME:
  902.  
  903.             String = Config -> TerminalConfig -> EmulationFileName;
  904.             break;
  905.  
  906.         case ATTR_PREFS_TERMINAL_FONTNAME:
  907.  
  908.             String = Config -> TerminalConfig -> TextFontName;
  909.             break;
  910.  
  911.         case ATTR_PREFS_TERMINAL_FONTSIZE:
  912.  
  913.             Number = Config -> TerminalConfig -> TextFontHeight;
  914.             break;
  915.  
  916.         case ATTR_PREFS_PATHS_ASCIIUPLOADPATH:
  917.  
  918.             String = Config -> PathConfig -> ASCIIUploadPath;
  919.             break;
  920.  
  921.         case ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH:
  922.  
  923.             String = Config -> PathConfig -> ASCIIDownloadPath;
  924.             break;
  925.  
  926.         case ATTR_PREFS_PATHS_TEXTUPLOADPATH:
  927.  
  928.             String = Config -> PathConfig -> TextUploadPath;
  929.             break;
  930.  
  931.         case ATTR_PREFS_PATHS_TEXTDOWNLOADPATH:
  932.  
  933.             String = Config -> PathConfig -> TextDownloadPath;
  934.             break;
  935.  
  936.         case ATTR_PREFS_PATHS_BINARYUPLOADPATH:
  937.  
  938.             String = Config -> PathConfig -> BinaryUploadPath;
  939.             break;
  940.  
  941.         case ATTR_PREFS_PATHS_BINARYDOWNLOADPATH:
  942.  
  943.             String = Config -> PathConfig -> BinaryDownloadPath;
  944.             break;
  945.  
  946.         case ATTR_PREFS_PATHS_CONFIGPATH:
  947.  
  948.             String = Config -> PathConfig -> DefaultStorage;
  949.             break;
  950.  
  951.         case ATTR_PREFS_PATHS_EDITORNAME:
  952.  
  953.             String = Config -> PathConfig -> Editor;
  954.             break;
  955.  
  956.         case ATTR_PREFS_PATHS_HELPFILENAME:
  957.  
  958.             String = Config -> PathConfig -> HelpFile;
  959.             break;
  960.  
  961.         case ATTR_PREFS_MISC_ALERTMODE:
  962.  
  963.             Number = Config -> MiscConfig -> AlertMode;
  964.             break;
  965.  
  966.         case ATTR_PREFS_MISC_REQUESTERMODE:
  967.  
  968.             Number = Config -> MiscConfig -> RequesterMode;
  969.             break;
  970.  
  971.         case ATTR_PREFS_MISC_REQUESTERWIDTH:
  972.  
  973.             Number = Config -> MiscConfig -> RequesterWidth;
  974.             break;
  975.  
  976.         case ATTR_PREFS_MISC_REQUESTERHEIGHT:
  977.  
  978.             Number = Config -> MiscConfig -> RequesterHeight;
  979.             break;
  980.  
  981.         case ATTR_PREFS_MISC_IOBUFFERSIZE:
  982.  
  983.             Number = Config -> MiscConfig -> IOBufferSize;
  984.             break;
  985.  
  986.         case ATTR_PREFS_MISC_PRIORITY:
  987.  
  988.             Number = Config -> MiscConfig -> Priority;
  989.             break;
  990.  
  991.         case ATTR_PREFS_MISC_BACKUPCONFIG:
  992.  
  993.             Number = Config -> MiscConfig -> BackupConfig;
  994.             break;
  995.  
  996.         case ATTR_PREFS_MISC_OVERWRITE_WARNING:
  997.  
  998.             Number = Config -> MiscConfig -> ProtectiveMode;
  999.             break;
  1000.  
  1001.         case ATTR_PREFS_MISC_OPENFASTMACROPANEL:
  1002.  
  1003.             Number = Config -> MiscConfig -> OpenFastMacroPanel;
  1004.             break;
  1005.  
  1006.         case ATTR_PREFS_MISC_RELEASEDEVICE:
  1007.  
  1008.             Number = Config -> MiscConfig -> ReleaseDevice;
  1009.             break;
  1010.  
  1011.         case ATTR_PREFS_MISC_OVERRIDEPATH:
  1012.         case ATTR_PREFS_TRANSFER_OVERRIDEPATH:
  1013.  
  1014.             Number = Config -> TransferConfig -> OverridePath;
  1015.             break;
  1016.  
  1017.         case ATTR_PREFS_MISC_AUTOUPLOAD:
  1018.  
  1019.             Number = Config -> MiscConfig -> AutoUpload;
  1020.             break;
  1021.  
  1022.         case ATTR_PREFS_MISC_SETARCHIVEDBIT:
  1023.         case ATTR_PREFS_TRANSFER_SETARCHIVEDBIT:
  1024.  
  1025.             Number = Config -> TransferConfig -> SetArchivedBit;
  1026.             break;
  1027.  
  1028.         case ATTR_PREFS_TRANSFER_COMMENTMODE:
  1029.         case ATTR_PREFS_MISC_COMMENTMODE:
  1030.  
  1031.             Number = Config -> TransferConfig -> IdentifyFiles;
  1032.             break;
  1033.  
  1034.         case ATTR_PREFS_MISC_TRANSFERICONS:
  1035.         case ATTR_PREFS_TRANSFER_TRANSFERICONS:
  1036.  
  1037.             Number = Config -> TransferConfig -> TransferIcons;
  1038.             break;
  1039.  
  1040.         case ATTR_PREFS_MISC_CREATEICONS:
  1041.  
  1042.             Number = Config -> MiscConfig -> CreateIcons;
  1043.             break;
  1044.  
  1045.         case ATTR_PREFS_MISC_SIMPLEIO:
  1046.  
  1047.             Number = Config -> MiscConfig -> SimpleIO;
  1048.             break;
  1049.  
  1050.         case ATTR_PREFS_MISC_HIDE_UPLOAD_ICON:
  1051.         case ATTR_PREFS_TRANSFER_HIDE_UPLOAD_ICON:
  1052.  
  1053.             Number = Config -> TransferConfig -> HideUploadIcon;
  1054.             break;
  1055.  
  1056.         case ATTR_PREFS_MISC_TRANSFER_PERFMETER:
  1057.         case ATTR_PREFS_TRANSFER_TRANSFER_PERFMETER:
  1058.  
  1059.             Number = Config -> TransferConfig -> PerfMeter;
  1060.             break;
  1061.  
  1062.         case ATTR_PREFS_CLIPBOARD_UNIT:
  1063.  
  1064.             Number = Config -> ClipConfig -> ClipboardUnit;
  1065.             break;
  1066.  
  1067.         case ATTR_PREFS_CLIPBOARD_LINEDELAY:
  1068.  
  1069.             Number = Config -> ClipConfig -> LineDelay;
  1070.             break;
  1071.  
  1072.         case ATTR_PREFS_CLIPBOARD_CHARDELAY:
  1073.  
  1074.             Number = Config -> ClipConfig -> CharDelay;
  1075.             break;
  1076.  
  1077.         case ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT:
  1078.  
  1079.             String = Config -> ClipConfig -> InsertPrefix;
  1080.             break;
  1081.  
  1082.         case ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT:
  1083.  
  1084.             String = Config -> ClipConfig -> InsertSuffix;
  1085.             break;
  1086.  
  1087.         case ATTR_PREFS_CLIPBOARD_LINEPROMPT:
  1088.  
  1089.             String = Config -> ClipConfig -> LinePrompt;
  1090.             break;
  1091.  
  1092.         case ATTR_PREFS_CLIPBOARD_TEXTPACING:
  1093.  
  1094.             Number = Config -> ClipConfig -> PacingMode;
  1095.             break;
  1096.  
  1097.         case ATTR_PREFS_CLIPBOARD_SENDTIMEOUT:
  1098.  
  1099.             Number = Config -> ClipConfig -> SendTimeout;
  1100.             break;
  1101.  
  1102.         case ATTR_PREFS_CLIPBOARD_CONVERTLF:
  1103.  
  1104.             Number = Config -> ClipConfig -> ConvertLF;
  1105.             break;
  1106.  
  1107.         case ATTR_PREFS_CAPTURE_CONVERTCHARACTERS:
  1108.  
  1109.             Number = Config -> CaptureConfig -> ConvertChars;
  1110.             break;
  1111.  
  1112.         case ATTR_PREFS_CAPTURE_BUFFERMODE:
  1113.  
  1114.             Number = Config -> CaptureConfig -> BufferMode;
  1115.             break;
  1116.  
  1117.         case ATTR_PREFS_CAPTURE_LOGACTIONS:
  1118.  
  1119.             Number = Config -> CaptureConfig -> LogActions;
  1120.             break;
  1121.  
  1122.         case ATTR_PREFS_CAPTURE_LOGCALLS:
  1123.  
  1124.             Number = Config -> CaptureConfig -> LogCall;
  1125.             break;
  1126.  
  1127.         case ATTR_PREFS_CAPTURE_LOGFILENAME:
  1128.  
  1129.             String = Config -> CaptureConfig -> LogFileName;
  1130.             break;
  1131.  
  1132.         case ATTR_PREFS_CAPTURE_MAXBUFFERSIZE:
  1133.  
  1134.             Number = Config -> CaptureConfig -> MaxBufferSize;
  1135.             break;
  1136.  
  1137.         case ATTR_PREFS_CAPTURE_BUFFER:
  1138.  
  1139.             Number = Config -> CaptureConfig -> BufferEnabled;
  1140.             break;
  1141.  
  1142.         case ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE:
  1143.  
  1144.             Number = Config -> CaptureConfig -> ConnectAutoCapture;
  1145.             break;
  1146.  
  1147.         case ATTR_PREFS_CAPTURE_AUTOCAPTUREDATE:
  1148.  
  1149.             Number = Config -> CaptureConfig -> AutoCaptureDate;
  1150.             break;
  1151.  
  1152.         case ATTR_PREFS_CAPTURE_CAPTUREFILTER:
  1153.  
  1154.             Number = Config -> CaptureConfig -> CaptureFilterMode;
  1155.             break;
  1156.  
  1157.         case ATTR_PREFS_CAPTURE_CAPTUREPATH:
  1158.  
  1159.             String = Config -> CaptureConfig -> CapturePath;
  1160.             break;
  1161.  
  1162.         case ATTR_PREFS_CAPTURE_CALLLOGFILENAME:
  1163.  
  1164.             String = Config -> CaptureConfig -> CallLogFileName;
  1165.             break;
  1166.  
  1167.         case ATTR_PREFS_CAPTURE_BUFFERSAVEPATH:
  1168.  
  1169.             String = Config -> CaptureConfig -> BufferPath;
  1170.             break;
  1171.  
  1172.         case ATTR_PREFS_CAPTURE_OPENBUFFERWINDOW:
  1173.  
  1174.             Number = Config -> CaptureConfig -> OpenBufferWindow;
  1175.             break;
  1176.  
  1177.         case ATTR_PREFS_CAPTURE_OPENBUFFERSCREEN:
  1178.  
  1179.             Number = Config -> CaptureConfig -> OpenBufferScreen;
  1180.             break;
  1181.  
  1182.         case ATTR_PREFS_CAPTURE_BUFFERSCREENPOSITION:
  1183.  
  1184.             Number = Config -> CaptureConfig -> BufferScreenPosition;
  1185.             break;
  1186.  
  1187.         case ATTR_PREFS_CAPTURE_BUFFERWIDTH:
  1188.  
  1189.             Number = Config -> CaptureConfig -> BufferWidth;
  1190.             break;
  1191.  
  1192.         case ATTR_PREFS_CAPTURE_SEARCH_HISTORY:
  1193.  
  1194.             Number = Config -> CaptureConfig -> SearchHistory;
  1195.             break;
  1196.  
  1197.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERWINDOW:
  1198.  
  1199.             Number = Config -> CaptureConfig -> RememberBufferWindow;
  1200.             break;
  1201.  
  1202.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERSCREEN:
  1203.  
  1204.             Number = Config -> CaptureConfig -> RememberBufferScreen;
  1205.             break;
  1206.  
  1207.         case ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME:
  1208.  
  1209.             String = Config -> TransferConfig -> DefaultLibrary;
  1210.             break;
  1211.  
  1212.         case ATTR_PREFS_FILE_TRANSLATIONFILENAME:
  1213.  
  1214.             String = Config -> TranslationFileName;
  1215.             break;
  1216.  
  1217.         case ATTR_PREFS_FILE_MACROFILENAME:
  1218.  
  1219.             String = Config -> MacroFileName;
  1220.             break;
  1221.  
  1222.         case ATTR_PREFS_FILE_CURSORFILENAME:
  1223.  
  1224.             String = Config -> CursorFileName;
  1225.             break;
  1226.  
  1227.         case ATTR_PREFS_FILE_FASTMACROFILENAME:
  1228.  
  1229.             String = Config -> FastMacroFileName;
  1230.             break;
  1231.  
  1232.         case ATTR_PREFS_EMULATION_IDENTIFICATION:
  1233.  
  1234.             Number = Config -> EmulationConfig -> TerminalType;
  1235.             break;
  1236.  
  1237.         case ATTR_PREFS_EMULATION_STYLELOCKED:
  1238.  
  1239.             Number = Config -> EmulationConfig -> LockStyle;
  1240.             break;
  1241.  
  1242.         case ATTR_PREFS_EMULATION_USEPENS:
  1243.  
  1244.             Number = Config -> EmulationConfig -> UseStandardPens;
  1245.             break;
  1246.  
  1247.         case ATTR_PREFS_EMULATION_COLOURLOCKED:
  1248.  
  1249.             Number = Config -> EmulationConfig -> LockColour;
  1250.             break;
  1251.  
  1252.         case ATTR_PREFS_EMULATION_CURSORMODE:
  1253.  
  1254.             Number = Config -> EmulationConfig -> CursorMode;
  1255.             break;
  1256.  
  1257.         case ATTR_PREFS_EMULATION_CURSORLOCKED:
  1258.  
  1259.             Number = Config -> EmulationConfig -> CursorLocked;
  1260.             break;
  1261.  
  1262.         case ATTR_PREFS_EMULATION_FONTLOCKED:
  1263.  
  1264.             Number = Config -> EmulationConfig -> FontLocked;
  1265.             break;
  1266.  
  1267.         case ATTR_PREFS_EMULATION_NUMPADLOCKED:
  1268.  
  1269.             Number = Config -> EmulationConfig -> KeysLocked;
  1270.             break;
  1271.  
  1272.         case ATTR_PREFS_EMULATION_WRAPLOCKED:
  1273.  
  1274.             Number = Config -> EmulationConfig -> LockWrapping;
  1275.             break;
  1276.  
  1277.         case ATTR_PREFS_EMULATION_NUMERICMODE:
  1278.  
  1279.             Number = Config -> EmulationConfig -> NumericMode;
  1280.             break;
  1281.  
  1282.         case ATTR_PREFS_EMULATION_CURSORWRAP:
  1283.  
  1284.             Number = Config -> EmulationConfig -> CursorWrap;
  1285.             break;
  1286.  
  1287.         case ATTR_PREFS_EMULATION_LINEWRAP:
  1288.  
  1289.             Number = Config -> EmulationConfig -> LineWrap;
  1290.             break;
  1291.  
  1292.         case ATTR_PREFS_EMULATION_INSERTMODE:
  1293.  
  1294.             Number = Config -> EmulationConfig -> InsertMode;
  1295.             break;
  1296.  
  1297.         case ATTR_PREFS_EMULATION_NEWLINEMODE:
  1298.  
  1299.             Number = Config -> EmulationConfig -> NewLineMode;
  1300.             break;
  1301. /*    OBSOLETE!
  1302.         case ATTR_PREFS_EMULATION_FONTSCALEMODE:
  1303.  
  1304.             Number = Config -> EmulationConfig -> FontScale;
  1305.             break;
  1306. */
  1307.         case ATTR_PREFS_EMULATION_SCROLLMODE:
  1308.  
  1309.             Number = Config -> EmulationConfig -> ScrollMode;
  1310.             break;
  1311.  
  1312.         case ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE:
  1313.  
  1314.             Number = Config -> EmulationConfig -> DestructiveBackspace;
  1315.             break;
  1316.  
  1317.         case ATTR_PREFS_EMULATION_SWAPBSDELETE:
  1318.  
  1319.             Number = Config -> EmulationConfig -> SwapBSDelete;
  1320.             break;
  1321.  
  1322.         case ATTR_PREFS_EMULATION_PRINTERENABLED:
  1323.  
  1324.             Number = Config -> EmulationConfig -> PrinterEnabled;
  1325.             break;
  1326.  
  1327.         case ATTR_PREFS_EMULATION_ANSWERBACKTEXT:
  1328.  
  1329.             String = Config -> EmulationConfig -> AnswerBack;
  1330.             break;
  1331.  
  1332.         case ATTR_PREFS_EMULATION_CLS_RESETS_CURSOR:
  1333.  
  1334.             Number = Config -> EmulationConfig -> CLSResetsCursor;
  1335.             break;
  1336.  
  1337.         case ATTR_PREFS_EMULATION_MAXSCROLL:
  1338.  
  1339.             Number = Config -> EmulationConfig -> MaxScroll;
  1340.             break;
  1341.  
  1342.         case ATTR_PREFS_EMULATION_MAXJUMP:
  1343.  
  1344.             Number = Config -> EmulationConfig -> MaxJump;
  1345.             break;
  1346.  
  1347.         case ATTR_PREFS_TRANSFER_DEFAULT_LIBRARY:
  1348.  
  1349.             String = Config -> TransferConfig -> DefaultLibrary;
  1350.             break;
  1351.  
  1352.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_LIBRARY:
  1353.  
  1354.             String = Config -> TransferConfig -> ASCIIUploadLibrary;
  1355.             break;
  1356.  
  1357.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_LIBRARY:
  1358.  
  1359.             String = Config -> TransferConfig -> ASCIIDownloadLibrary;
  1360.             break;
  1361.  
  1362.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_LIBRARY:
  1363.  
  1364.             String = Config -> TransferConfig -> TextUploadLibrary;
  1365.             break;
  1366.  
  1367.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_LIBRARY:
  1368.  
  1369.             String = Config -> TransferConfig -> TextDownloadLibrary;
  1370.             break;
  1371.  
  1372.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_LIBRARY:
  1373.  
  1374.             String = Config -> TransferConfig -> BinaryUploadLibrary;
  1375.             break;
  1376.  
  1377.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_LIBRARY:
  1378.  
  1379.             String = Config -> TransferConfig -> BinaryDownloadLibrary;
  1380.             break;
  1381.  
  1382.         case ATTR_PREFS_TRANSFER_INTERNAL_ASCII_DOWNLOAD:
  1383.  
  1384.             Number = Config -> TransferConfig -> InternalASCIIDownload;
  1385.             break;
  1386.  
  1387.         case ATTR_PREFS_TRANSFER_INTERNAL_ASCII_UPLOAD:
  1388.  
  1389.             Number = Config -> TransferConfig -> InternalASCIIUpload;
  1390.             break;
  1391.  
  1392.         case ATTR_PREFS_TRANSFER_QUIET_TRANSFER:
  1393.  
  1394.             Number = Config -> TransferConfig -> QuietTransfer;
  1395.             break;
  1396.  
  1397.         case ATTR_PREFS_TRANSFER_MANGLE_FILE_NAMES:
  1398.  
  1399.             Number = Config -> TransferConfig -> MangleFileNames;
  1400.             break;
  1401.  
  1402.         case ATTR_PREFS_TRANSFER_STRIP_BIT_8:
  1403.  
  1404.             Number = Config -> TransferConfig -> StripBit8;
  1405.             break;
  1406.  
  1407.         case ATTR_PREFS_TRANSFER_IGNORE_DATA_PAST_ARNOLD:
  1408.  
  1409.             Number = Config -> TransferConfig -> IgnoreDataPastArnold;
  1410.             break;
  1411.  
  1412.         case ATTR_PREFS_TRANSFER_TERMINATOR_CHAR:
  1413.  
  1414.             Number = Config -> TransferConfig -> TerminatorChar;
  1415.             break;
  1416.  
  1417.         case ATTR_PREFS_TRANSFER_LINEDELAY:
  1418.  
  1419.             Number = Config -> TransferConfig -> LineDelay;
  1420.             break;
  1421.  
  1422.         case ATTR_PREFS_TRANSFER_CHARDELAY:
  1423.  
  1424.             Number = Config -> TransferConfig -> CharDelay;
  1425.             break;
  1426.  
  1427.         case ATTR_PREFS_TRANSFER_LINEPROMPT:
  1428.  
  1429.             String = Config -> TransferConfig -> LinePrompt;
  1430.             break;
  1431.  
  1432.         case ATTR_PREFS_TRANSFER_TEXTPACING:
  1433.  
  1434.             Number = Config -> TransferConfig -> PacingMode;
  1435.             break;
  1436.  
  1437.         case ATTR_PREFS_TRANSFER_SENDTIMEOUT:
  1438.  
  1439.             Number = Config -> TransferConfig -> SendTimeout;
  1440.             break;
  1441.  
  1442.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_COUNT:
  1443.  
  1444.             Number = Config -> TransferConfig -> ErrorNotification;
  1445.             break;
  1446.  
  1447.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_WHEN:
  1448.  
  1449.             Number = Config -> TransferConfig -> TransferNotification;
  1450.             break;
  1451.  
  1452.         case ATTR_PREFS_TRANSFER_DEFAULT_TYPE:
  1453.  
  1454.             Number = Config -> TransferConfig -> DefaultType;
  1455.             break;
  1456.  
  1457.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_TYPE:
  1458.  
  1459.             Number = Config -> TransferConfig -> ASCIIUploadType;
  1460.             break;
  1461.  
  1462.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_TYPE:
  1463.  
  1464.             Number = Config -> TransferConfig -> ASCIIDownloadType;
  1465.             break;
  1466.  
  1467.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_TYPE:
  1468.  
  1469.             Number = Config -> TransferConfig -> TextUploadType;
  1470.             break;
  1471.  
  1472.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_TYPE:
  1473.  
  1474.             Number = Config -> TransferConfig -> TextDownloadType;
  1475.             break;
  1476.  
  1477.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_TYPE:
  1478.  
  1479.             Number = Config -> TransferConfig -> BinaryUploadType;
  1480.             break;
  1481.  
  1482.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_TYPE:
  1483.  
  1484.             Number = Config -> TransferConfig -> BinaryDownloadType;
  1485.             break;
  1486.  
  1487.         case ATTR_PREFS_TRANSFER_DEFAULT_SEND_SIGNATURE:
  1488.  
  1489.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTUPLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTUPLOAD] . Length,ResultBuffer);
  1490.  
  1491.             String = ResultBuffer;
  1492.             break;
  1493.  
  1494.         case ATTR_PREFS_TRANSFER_DEFAULT_RECEIVE_SIGNATURE:
  1495.  
  1496.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTDOWNLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTDOWNLOAD] . Length,ResultBuffer);
  1497.  
  1498.             String = ResultBuffer;
  1499.             break;
  1500.  
  1501.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_SIGNATURE:
  1502.  
  1503.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_ASCIIUPLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_ASCIIUPLOAD] . Length,ResultBuffer);
  1504.  
  1505.             String = ResultBuffer;
  1506.             break;
  1507.  
  1508.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_SIGNATURE:
  1509.  
  1510.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_ASCIIDOWNLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_ASCIIDOWNLOAD] . Length,ResultBuffer);
  1511.  
  1512.             String = ResultBuffer;
  1513.             break;
  1514.  
  1515.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_SIGNATURE:
  1516.  
  1517.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTUPLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTUPLOAD] . Length,ResultBuffer);
  1518.  
  1519.             String = ResultBuffer;
  1520.             break;
  1521.  
  1522.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_SIGNATURE:
  1523.  
  1524.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTDOWNLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTDOWNLOAD] . Length,ResultBuffer);
  1525.  
  1526.             String = ResultBuffer;
  1527.             break;
  1528.  
  1529.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_SIGNATURE:
  1530.  
  1531.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYUPLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYUPLOAD] . Length,ResultBuffer);
  1532.  
  1533.             String = ResultBuffer;
  1534.             break;
  1535.  
  1536.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_SIGNATURE:
  1537.  
  1538.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYDOWNLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYDOWNLOAD] . Length,ResultBuffer);
  1539.  
  1540.             String = ResultBuffer;
  1541.             break;
  1542.  
  1543.         case ATTR_PREFS_SPEECH_RATE:
  1544.  
  1545.             Number = SpeechConfig . Rate;
  1546.             break;
  1547.  
  1548.         case ATTR_PREFS_SPEECH_PITCH:
  1549.  
  1550.             Number = SpeechConfig . Pitch;
  1551.             break;
  1552.  
  1553.         case ATTR_PREFS_SPEECH_FREQUENCY:
  1554.  
  1555.             Number = SpeechConfig . Frequency;
  1556.             break;
  1557.  
  1558.         case ATTR_PREFS_SPEECH_SEXMODE:
  1559.  
  1560.             Number = SpeechConfig . Sex;
  1561.             break;
  1562.  
  1563.         case ATTR_PREFS_SPEECH_VOLUME:
  1564.  
  1565.             Number = (100 * SpeechConfig . Volume) / 64;
  1566.             break;
  1567.  
  1568.         case ATTR_PREFS_SPEECH_SPEECH:
  1569.  
  1570.             Number = SpeechConfig . Enabled;
  1571.             break;
  1572.  
  1573.         case ATTR_PREFS_TRANSLATIONS_X_SEND:
  1574.  
  1575.             if(Count1 < 0 || Count1 > 255)
  1576.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1577.             else
  1578.             {
  1579.                 if(SendTable)
  1580.                 {
  1581.                     if(SendTable[Count1])
  1582.                         TranslateBack(SendTable[Count1] -> String,SendTable[Count1] -> Len,ResultBuffer);
  1583.                     else
  1584.                         SPrintf(ResultBuffer,"\\*%s",CodeToName(Count1));
  1585.                 }
  1586.                 else
  1587.                     SPrintf(ResultBuffer,"\\*%s",CodeToName(Count1));
  1588.  
  1589.                 String = ResultBuffer;
  1590.             }
  1591.  
  1592.             break;
  1593.  
  1594.         case ATTR_PREFS_TRANSLATIONS_X_RECEIVE:
  1595.  
  1596.             if(Count1 < 0 || Count1 > 255)
  1597.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1598.             else
  1599.             {
  1600.                 if(ReceiveTable)
  1601.                 {
  1602.                     if(ReceiveTable[Count1])
  1603.                         TranslateBack(ReceiveTable[Count1] -> String,ReceiveTable[Count1] -> Len,ResultBuffer);
  1604.                     else
  1605.                         SPrintf(ResultBuffer,"\\*%s",CodeToName(Count1));
  1606.                 }
  1607.                 else
  1608.                     SPrintf(ResultBuffer,"\\*%s",CodeToName(Count1));
  1609.             }
  1610.  
  1611.             String = ResultBuffer;
  1612.  
  1613.             break;
  1614.  
  1615.         case ATTR_PREFS_FASTMACROS_COUNT:
  1616.  
  1617.             Number = FastMacroCount;
  1618.             break;
  1619.  
  1620.         case ATTR_PREFS_FASTMACROS_X_NAME:
  1621.  
  1622.             if(Count1 < FastMacroCount && Count1 >= 0)
  1623.             {
  1624.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  1625.  
  1626.                 String = Node -> mn_Macro;
  1627.             }
  1628.             else
  1629.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1630.  
  1631.             break;
  1632.  
  1633.         case ATTR_PREFS_FASTMACROS_X_CODE:
  1634.  
  1635.             if(Count1 < FastMacroCount && Count1 >= 0)
  1636.             {
  1637.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  1638.  
  1639.                 String = Node -> mn_Code;
  1640.             }
  1641.             else
  1642.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1643.  
  1644.             break;
  1645.  
  1646.         case ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT:
  1647.  
  1648.             String = Hotkeys . termScreenToFront;
  1649.             break;
  1650.  
  1651.         case ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT:
  1652.  
  1653.             String = Hotkeys . BufferScreenToFront;
  1654.             break;
  1655.  
  1656.         case ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT:
  1657.  
  1658.             String = Hotkeys . SkipDialEntry;
  1659.             break;
  1660.  
  1661.         case ATTR_PREFS_HOTKEYS_ABORTAREXX:
  1662.  
  1663.             String = Hotkeys . AbortARexx;
  1664.             break;
  1665.  
  1666.         case ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY:
  1667.  
  1668.             Number = Hotkeys . CommodityPriority;
  1669.             break;
  1670.  
  1671.         case ATTR_PREFS_HOTKEYS_HOTKEYSENABLED:
  1672.  
  1673.             Number = Hotkeys . HotkeysEnabled;
  1674.             break;
  1675.  
  1676.         case ATTR_PREFS_CURSORKEYS_UPTEXT:
  1677.  
  1678.             String = CursorKeys -> Keys[0][0];
  1679.             break;
  1680.  
  1681.         case ATTR_PREFS_CURSORKEYS_RIGHTTEXT:
  1682.  
  1683.             String = CursorKeys -> Keys[0][1];
  1684.             break;
  1685.  
  1686.         case ATTR_PREFS_CURSORKEYS_DOWNTEXT:
  1687.  
  1688.             String = CursorKeys -> Keys[0][2];
  1689.             break;
  1690.  
  1691.         case ATTR_PREFS_CURSORKEYS_LEFTTEXT:
  1692.  
  1693.             String = CursorKeys -> Keys[0][3];
  1694.             break;
  1695.  
  1696.         case ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT:
  1697.  
  1698.             String = CursorKeys -> Keys[1][0];
  1699.             break;
  1700.  
  1701.         case ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT:
  1702.  
  1703.             String = CursorKeys -> Keys[1][1];
  1704.             break;
  1705.  
  1706.         case ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT:
  1707.  
  1708.             String = CursorKeys -> Keys[1][2];
  1709.             break;
  1710.  
  1711.         case ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT:
  1712.  
  1713.             String = CursorKeys -> Keys[1][3];
  1714.             break;
  1715.  
  1716.         case ATTR_PREFS_CURSORKEYS_ALT_UPTEXT:
  1717.  
  1718.             String = CursorKeys -> Keys[2][0];
  1719.             break;
  1720.  
  1721.         case ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT:
  1722.  
  1723.             String = CursorKeys -> Keys[2][1];
  1724.             break;
  1725.  
  1726.         case ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT:
  1727.  
  1728.             String = CursorKeys -> Keys[2][2];
  1729.             break;
  1730.  
  1731.         case ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT:
  1732.  
  1733.             String = CursorKeys -> Keys[2][3];
  1734.             break;
  1735.  
  1736.         case ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT:
  1737.  
  1738.             String = CursorKeys -> Keys[3][0];
  1739.             break;
  1740.  
  1741.         case ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT:
  1742.  
  1743.             String = CursorKeys -> Keys[3][1];
  1744.             break;
  1745.  
  1746.         case ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT:
  1747.  
  1748.             String = CursorKeys -> Keys[3][2];
  1749.             break;
  1750.  
  1751.         case ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT:
  1752.  
  1753.             String = CursorKeys -> Keys[3][3];
  1754.             break;
  1755.  
  1756.         case ATTR_PREFS_FUNCTIONKEYS_X:
  1757.  
  1758.             if(Count1 < 1 || Count1 > 10)
  1759.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1760.             else
  1761.                 String = MacroKeys -> Keys[0][Count1 - 1];
  1762.  
  1763.             break;
  1764.  
  1765.         case ATTR_PREFS_FUNCTIONKEYS_SHIFT_X:
  1766.  
  1767.             if(Count1 < 1 || Count1 > 10)
  1768.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1769.             else
  1770.                 String = MacroKeys -> Keys[1][Count1 - 1];
  1771.  
  1772.             break;
  1773.  
  1774.         case ATTR_PREFS_FUNCTIONKEYS_ALT_X:
  1775.  
  1776.             if(Count1 < 1 || Count1 > 10)
  1777.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1778.             else
  1779.                 String = MacroKeys -> Keys[2][Count1 - 1];
  1780.  
  1781.             break;
  1782.  
  1783.         case ATTR_PREFS_FUNCTIONKEYS_CONTROL_X:
  1784.  
  1785.             if(Count1 < 1 || Count1 > 10)
  1786.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1787.             else
  1788.                 String = MacroKeys -> Keys[3][Count1 - 1];
  1789.  
  1790.             break;
  1791.  
  1792.         case ATTR_PREFS_PROTOCOL:
  1793.  
  1794.             String = ProtocolOptsBuffer;
  1795.             break;
  1796.  
  1797.         case ATTR_PREFS_CONSOLE:
  1798.  
  1799.             String = WindowName;
  1800.             break;
  1801.  
  1802.         case ATTR_PHONEBOOK_COUNT:
  1803.  
  1804.             Number = NumPhoneEntries;
  1805.             break;
  1806.  
  1807.         case ATTR_PHONEBOOK_X_NAME:
  1808.  
  1809.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1810.                 String = Phonebook[Count1] -> Header -> Name;
  1811.             else
  1812.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1813.  
  1814.             break;
  1815.  
  1816.         case ATTR_PHONEBOOK_X_NUMBER:
  1817.  
  1818.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1819.                 String = Phonebook[Count1] -> Header -> Number;
  1820.             else
  1821.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1822.  
  1823.             break;
  1824.  
  1825.         case ATTR_PHONEBOOK_X_COMMENTTEXT:
  1826.  
  1827.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1828.                 String = Phonebook[Count1] -> Header -> Comment;
  1829.             else
  1830.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1831.  
  1832.             break;
  1833.  
  1834.         case ATTR_PHONEBOOK_X_USERNAME:
  1835.  
  1836.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1837.                 String = Phonebook[Count1] -> Header -> UserName;
  1838.             else
  1839.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1840.  
  1841.             break;
  1842.  
  1843.         case ATTR_PHONEBOOK_X_PASSWORDTEXT:
  1844.  
  1845.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1846.                 String = Phonebook[Count1] -> Header -> Password;
  1847.             else
  1848.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1849.  
  1850.             break;
  1851.  
  1852.         case ATTR_PREFS_SOUND_BELLNAME:
  1853.  
  1854.             String = SoundConfig . BellFile;
  1855.             break;
  1856.  
  1857.         case ATTR_PREFS_SOUND_ERROR:
  1858.  
  1859.             String = SoundConfig . ErrorNotifyFile;
  1860.             break;
  1861.  
  1862.         case ATTR_PREFS_SOUND_CONNECTNAME:
  1863.  
  1864.             String = SoundConfig . ConnectFile;
  1865.             break;
  1866.  
  1867.         case ATTR_PREFS_SOUND_DISCONNECTNAME:
  1868.  
  1869.             String = SoundConfig . DisconnectFile;
  1870.             break;
  1871.  
  1872.         case ATTR_PREFS_SOUND_GOODTRANSFERNAME:
  1873.  
  1874.             String = SoundConfig . GoodTransferFile;
  1875.             break;
  1876.  
  1877.         case ATTR_PREFS_SOUND_BADTRANSFERNAME:
  1878.  
  1879.             String = SoundConfig . BadTransferFile;
  1880.             break;
  1881.  
  1882.         case ATTR_PREFS_SOUND_RINGNAME:
  1883.  
  1884.             String = SoundConfig . RingFile;
  1885.             break;
  1886.  
  1887.         case ATTR_PREFS_SOUND_VOICENAME:
  1888.  
  1889.             String = SoundConfig . VoiceFile;
  1890.             break;
  1891.  
  1892.         case ATTR_PREFS_SOUND_PRELOAD:
  1893.  
  1894.             Number = SoundConfig . Preload;
  1895.             break;
  1896.  
  1897.         case ATTR_PREFS_SOUND_VOLUME:
  1898.  
  1899.             Number = SoundConfig . Volume;
  1900.             break;
  1901.     }
  1902.  
  1903.     if(!Error)
  1904.     {
  1905.         switch(AttributeTable[Index] . Type)
  1906.         {
  1907.             case INFO_TEXT:
  1908.  
  1909.                 *Result = String;
  1910.  
  1911.                 break;
  1912.  
  1913.             case INFO_NUMERIC:
  1914.  
  1915.                 SPrintf(ResultBuffer,"%ld",Number);
  1916.  
  1917.                 *Result = ResultBuffer;
  1918.  
  1919.                 break;
  1920.  
  1921.             case INFO_BOOLEAN:
  1922.  
  1923.                 *Result = ToBoolean(Number);
  1924.  
  1925.                 break;
  1926.  
  1927.             case INFO_MAPPED:
  1928.  
  1929.                 *Result = ToMap(Number,AttributeTable[Index] . Mappings);
  1930.  
  1931.                 break;
  1932.         }
  1933.     }
  1934.  
  1935.     return(Error);
  1936. }
  1937.  
  1938.     /* SetSingleAttribute(WORD ID,WORD Index,WORD Count1,STRPTR Input):
  1939.      *
  1940.      *    Beware the MONSTER!
  1941.      */
  1942.  
  1943. STATIC LONG __regargs
  1944. SetSingleAttribute(WORD ID,WORD Index,WORD Count1,STRPTR Input)
  1945. {
  1946.     STRPTR    String;
  1947.     LONG    Number,Error = 0,i;
  1948.  
  1949.     switch(AttributeTable[Index] . Type)
  1950.     {
  1951.         case INFO_TEXT:
  1952.  
  1953.             String = Input;
  1954.             break;
  1955.  
  1956.         case INFO_NUMERIC:
  1957.  
  1958.             Number = Atol(Input);
  1959.             break;
  1960.  
  1961.         case INFO_BOOLEAN:
  1962.  
  1963.             Number = FromBoolean(Input);
  1964.             break;
  1965.  
  1966.         case INFO_MAPPED:
  1967.  
  1968.             if((Number = FromMap(Input,AttributeTable[Index] . Mappings)) == -1)
  1969.                 return(ERROR_TOO_MANY_ARGS);
  1970.             else
  1971.                 break;
  1972.     }
  1973.  
  1974.     UpdateRequired        = TRUE;
  1975.     TransferUpdateRequired    = FALSE;
  1976.  
  1977.     switch(ID)
  1978.     {
  1979.         case ATTR_PREFS_SERIAL_BAUDRATE:
  1980.         {
  1981.             ULONG    Rate = 0;
  1982.             WORD    i;
  1983.  
  1984.             for(i = 0 ; i < NumBaudRates ; i++)
  1985.             {
  1986.                 if(BaudRates[i] >= Number)
  1987.                 {
  1988.                     Rate = BaudRates[i];
  1989.  
  1990.                     break;
  1991.                 }
  1992.             }
  1993.  
  1994.             if(Rate && Rate != Config -> SerialConfig -> BaudRate)
  1995.             {
  1996.                 Config -> SerialConfig -> BaudRate = Rate;
  1997.  
  1998.                 ConfigChanged = TRUE;
  1999.  
  2000.                 UpdateRequired = TRUE;
  2001.             }
  2002.  
  2003.             break;
  2004.         }
  2005.  
  2006.         case ATTR_PREFS_SERIAL_OWNDEVUNIT_REQUEST:
  2007.  
  2008.             Config -> SerialConfig -> SatisfyODURequests = Number;
  2009.  
  2010.             ConfigChanged = TRUE;
  2011.  
  2012.             break;
  2013.  
  2014.         case ATTR_PREFS_SERIAL_DIRECT_CONNECTION:
  2015.  
  2016.             Config -> SerialConfig -> DirectConnection = Number;
  2017.  
  2018.             ConfigChanged = TRUE;
  2019.  
  2020.             break;
  2021.  
  2022.         case ATTR_PREFS_SERIAL_BREAKLENGTH:
  2023.  
  2024.             Config -> SerialConfig -> BreakLength = Number;
  2025.  
  2026.             UpdateRequired = ConfigChanged = TRUE;
  2027.  
  2028.             break;
  2029.  
  2030.         case ATTR_PREFS_SERIAL_BUFFERSIZE:
  2031.         {
  2032.             WORD i;
  2033.  
  2034.             for(i = 9 ; i <= 19 ; i++)
  2035.             {
  2036.                 if(1L << i >= Number)
  2037.                 {
  2038.                     Config -> SerialConfig -> SerialBufferSize = 1L << i;
  2039.  
  2040.                     Update_CR_LF_Translation();
  2041.  
  2042.                     UpdateRequired = ConfigChanged = TRUE;
  2043.  
  2044.                     break;
  2045.                 }
  2046.             }
  2047.  
  2048.             break;
  2049.         }
  2050.  
  2051.         case ATTR_PREFS_SERIAL_QUANTUM:
  2052.         {
  2053.             WORD i;
  2054.  
  2055.             for(i = 8 ; i <= 19 ; i++)
  2056.             {
  2057.                 if(1L << i >= Number)
  2058.                 {
  2059.                     Config -> SerialConfig -> Quantum = 1L << i;
  2060.  
  2061.                     UpdateRequired = ConfigChanged = TRUE;
  2062.  
  2063.                     break;
  2064.                 }
  2065.             }
  2066.  
  2067.             break;
  2068.         }
  2069.  
  2070.         case ATTR_PREFS_SERIAL_DEVICENAME:
  2071.  
  2072.             strcpy(Config -> SerialConfig -> SerialDevice,String);
  2073.  
  2074.             UpdateRequired = ConfigChanged = TRUE;
  2075.  
  2076.             break;
  2077.  
  2078.         case ATTR_PREFS_SERIAL_UNIT:
  2079.  
  2080.             if(Number >= 0)
  2081.             {
  2082.                 Config -> SerialConfig -> UnitNumber = Number;
  2083.  
  2084.                 UpdateRequired = ConfigChanged = TRUE;
  2085.             }
  2086.             else
  2087.                 Error = TERMERROR_UNIT_NOT_AVAILABLE;
  2088.  
  2089.             break;
  2090.  
  2091.         case ATTR_PREFS_SERIAL_BITSPERCHAR:
  2092.  
  2093.             if(Number < 7 || Number > 8)
  2094.             {
  2095.                 Error = ERROR_BAD_NUMBER;
  2096.  
  2097.                 UpdateRequired = ConfigChanged = TRUE;
  2098.             }
  2099.             else
  2100.                 Config -> SerialConfig -> BitsPerChar = Number;
  2101.  
  2102.             break;
  2103.  
  2104.         case ATTR_PREFS_SERIAL_PARITYMODE:
  2105.  
  2106.             Config -> SerialConfig -> Parity = Number;
  2107.  
  2108.             UpdateRequired = ConfigChanged = TRUE;
  2109.  
  2110.             break;
  2111.  
  2112.         case ATTR_PREFS_SERIAL_STOPBITS:
  2113.  
  2114.             if(Number < 0 || Number > 1)
  2115.                 Error = ERROR_BAD_NUMBER;
  2116.             else
  2117.             {
  2118.                 Config -> SerialConfig -> StopBits = Number;
  2119.  
  2120.                 UpdateRequired = ConfigChanged = TRUE;
  2121.             }
  2122.  
  2123.             break;
  2124.  
  2125.         case ATTR_PREFS_SERIAL_HANDSHAKINGMODE:
  2126.  
  2127.             Config -> SerialConfig -> HandshakingProtocol = Number;
  2128.  
  2129.             UpdateRequired = ConfigChanged = TRUE;
  2130.  
  2131.             break;
  2132.  
  2133.         case ATTR_PREFS_SERIAL_DUPLEXMODE:
  2134.  
  2135.             Config -> SerialConfig -> Duplex = Number;
  2136.  
  2137.             ConfigChanged = TRUE;
  2138.  
  2139.             break;
  2140.  
  2141.         case ATTR_PREFS_SERIAL_XONXOFF:
  2142.  
  2143.             Config -> SerialConfig -> xONxOFF = Number;
  2144.  
  2145.             ConfigChanged = TRUE;
  2146.  
  2147.             break;
  2148.  
  2149.         case ATTR_PREFS_SERIAL_HIGHSPEED:
  2150.  
  2151.             Config -> SerialConfig -> HighSpeed = Number;
  2152.  
  2153.             UpdateRequired = ConfigChanged = TRUE;
  2154.  
  2155.             break;
  2156.  
  2157.         case ATTR_PREFS_SERIAL_SHARED:
  2158.  
  2159.             Config -> SerialConfig -> Shared = Number;
  2160.  
  2161.             UpdateRequired = ConfigChanged = TRUE;
  2162.  
  2163.             break;
  2164.  
  2165.         case ATTR_PREFS_SERIAL_STRIPBIT8:
  2166.  
  2167.             Config -> SerialConfig -> StripBit8 = Number;
  2168.  
  2169.             ConfigChanged = TRUE;
  2170.  
  2171.             break;
  2172.  
  2173.         case ATTR_PREFS_SERIAL_CARRIERCHECK:
  2174.  
  2175.             Config -> SerialConfig -> CheckCarrier = Number;
  2176.  
  2177.             ConfigChanged = TRUE;
  2178.  
  2179.             break;
  2180.  
  2181.         case ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH:
  2182.  
  2183.             Config -> SerialConfig -> PassThrough = Number;
  2184.  
  2185.             ConfigChanged = TRUE;
  2186.  
  2187.             break;
  2188.  
  2189.         case ATTR_PREFS_SERIAL_USE_OWNDEVUNIT:
  2190.  
  2191.             Config -> SerialConfig -> UseOwnDevUnit = Number;
  2192.  
  2193.             UpdateRequired = ConfigChanged = TRUE;
  2194.  
  2195.             break;
  2196.  
  2197.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_ONLINE:
  2198.  
  2199.             Config -> SerialConfig -> ReleaseODUWhenOnline = Number;
  2200.  
  2201.             ConfigChanged = TRUE;
  2202.  
  2203.             break;
  2204.  
  2205.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_DIALING:
  2206.  
  2207.             Config -> SerialConfig -> ReleaseODUWhenDialing = Number;
  2208.  
  2209.             ConfigChanged = TRUE;
  2210.  
  2211.             break;
  2212.  
  2213.         case ATTR_PREFS_SERIAL_NO_ODU_IF_SHARED:
  2214.  
  2215.             Config -> SerialConfig -> NoODUIfShared = Number;
  2216.  
  2217.             ConfigChanged = TRUE;
  2218.  
  2219.             break;
  2220.  
  2221.         case ATTR_PREFS_MODEM_DIAL_MODE:
  2222.  
  2223.             Config -> ModemConfig -> DialMode = Number;
  2224.  
  2225.             ConfigChanged = TRUE;
  2226.  
  2227.             break;
  2228.  
  2229.         case ATTR_PREFS_MODEM_PBX_MODE:
  2230.  
  2231.             Config -> ModemConfig -> PBX_Mode = Number;
  2232.  
  2233.             ConfigChanged = TRUE;
  2234.  
  2235.             break;
  2236.  
  2237.         case ATTR_PREFS_MODEM_PBX_PREFIX:
  2238.  
  2239.             strcpy(Config -> ModemConfig -> PBX_Prefix,String);
  2240.  
  2241.             ConfigChanged = TRUE;
  2242.  
  2243.             break;
  2244.  
  2245.         case ATTR_PREFS_MODEM_DO_NOT_SEND_COMMANDS:
  2246.  
  2247.             Config -> ModemConfig -> DoNotSendMainModemCommands = Number;
  2248.  
  2249.             ConfigChanged = TRUE;
  2250.  
  2251.             break;
  2252.  
  2253.         case ATTR_PREFS_MODEM_CHAR_SEND_DELAY:
  2254.  
  2255.             Config -> ModemConfig -> CharSendDelay = Number;
  2256.  
  2257.             ConfigChanged = TRUE;
  2258.  
  2259.             break;
  2260.  
  2261.         case ATTR_PREFS_MODEM_MODEMINITTEXT:
  2262.  
  2263.             strcpy(Config -> ModemConfig -> ModemInit,String);
  2264.  
  2265.             ConfigChanged = TRUE;
  2266.  
  2267.             break;
  2268.  
  2269.         case ATTR_PREFS_MODEM_MODEMEXITTEXT:
  2270.  
  2271.             strcpy(Config -> ModemConfig -> ModemExit,String);
  2272.  
  2273.             ConfigChanged = TRUE;
  2274.  
  2275.             break;
  2276.  
  2277.         case ATTR_PREFS_MODEM_MODEMHANGUPTEXT:
  2278.  
  2279.             strcpy(Config -> ModemConfig -> ModemHangup,String);
  2280.  
  2281.             ConfigChanged = TRUE;
  2282.  
  2283.             break;
  2284.  
  2285.         case ATTR_PREFS_MODEM_DIALPREFIXTEXT:
  2286.  
  2287.             strcpy(Config -> ModemConfig -> DialPrefix,String);
  2288.  
  2289.             ConfigChanged = TRUE;
  2290.  
  2291.             break;
  2292.  
  2293.         case ATTR_PREFS_MODEM_DIALSUFFIXTEXT:
  2294.  
  2295.             strcpy(Config -> ModemConfig -> DialSuffix,String);
  2296.  
  2297.             ConfigChanged = TRUE;
  2298.  
  2299.             break;
  2300.  
  2301.         case ATTR_PREFS_MODEM_NOCARRIERTEXT:
  2302.  
  2303.             strcpy(Config -> ModemConfig -> NoCarrier,String);
  2304.  
  2305.             ConfigChanged = TRUE;
  2306.  
  2307.             break;
  2308.  
  2309.         case ATTR_PREFS_MODEM_NODIALTONETEXT:
  2310.  
  2311.             strcpy(Config -> ModemConfig -> NoDialTone,String);
  2312.  
  2313.             ConfigChanged = TRUE;
  2314.  
  2315.             break;
  2316.  
  2317.         case ATTR_PREFS_MODEM_CONNECTTEXT:
  2318.  
  2319.             strcpy(Config -> ModemConfig -> Connect,String);
  2320.  
  2321.             ConfigChanged = TRUE;
  2322.  
  2323.             break;
  2324.  
  2325.         case ATTR_PREFS_MODEM_VOICETEXT:
  2326.  
  2327.             strcpy(Config -> ModemConfig -> Voice,String);
  2328.  
  2329.             ConfigChanged = TRUE;
  2330.  
  2331.             break;
  2332.  
  2333.         case ATTR_PREFS_MODEM_RINGTEXT:
  2334.  
  2335.             strcpy(Config -> ModemConfig -> Ring,String);
  2336.  
  2337.             ConfigChanged = TRUE;
  2338.  
  2339.             break;
  2340.  
  2341.         case ATTR_PREFS_MODEM_BUSYTEXT:
  2342.  
  2343.             strcpy(Config -> ModemConfig -> Busy,String);
  2344.  
  2345.             ConfigChanged = TRUE;
  2346.  
  2347.             break;
  2348.  
  2349.         case ATTR_PREFS_MODEM_OKTEXT:
  2350.  
  2351.             strcpy(Config -> ModemConfig -> Ok,String);
  2352.  
  2353.             ConfigChanged = TRUE;
  2354.  
  2355.             break;
  2356.  
  2357.         case ATTR_PREFS_MODEM_ERRORTEXT:
  2358.  
  2359.             strcpy(Config -> ModemConfig -> Error,String);
  2360.  
  2361.             ConfigChanged = TRUE;
  2362.  
  2363.             break;
  2364.  
  2365.         case ATTR_PREFS_MODEM_REDIALDELAY:
  2366.  
  2367.             if(Number >= 0)
  2368.             {
  2369.                 Config -> ModemConfig -> RedialDelay = Number;
  2370.  
  2371.                 ConfigChanged = TRUE;
  2372.             }
  2373.             else
  2374.                 Error = ERROR_BAD_NUMBER;
  2375.  
  2376.             break;
  2377.  
  2378.         case ATTR_PREFS_MODEM_DIALRETRIES:
  2379.  
  2380.             if(Number < 0)
  2381.                 Error = ERROR_BAD_NUMBER;
  2382.             else
  2383.             {
  2384.                 Config -> ModemConfig -> DialRetries = Number;
  2385.  
  2386.                 ConfigChanged = TRUE;
  2387.             }
  2388.  
  2389.             break;
  2390.  
  2391.         case ATTR_PREFS_MODEM_DIALTIMEOUT:
  2392.  
  2393.             if(Number < 0)
  2394.                 Error = ERROR_BAD_NUMBER;
  2395.             else
  2396.             {
  2397.                 Config -> ModemConfig -> DialTimeout = Number;
  2398.  
  2399.                 ConfigChanged = TRUE;
  2400.             }
  2401.  
  2402.             break;
  2403.  
  2404.         case ATTR_PREFS_MODEM_INTER_DIAL_DELAY:
  2405.  
  2406.             if(Number < 0)
  2407.                 Error = ERROR_BAD_NUMBER;
  2408.             else
  2409.             {
  2410.                 Config -> ModemConfig -> InterDialDelay = Number;
  2411.  
  2412.                 ConfigChanged = TRUE;
  2413.             }
  2414.  
  2415.             break;
  2416.  
  2417.         case ATTR_PREFS_MODEM_CONNECTAUTOBAUD:
  2418.  
  2419.             Config -> ModemConfig -> ConnectAutoBaud = Number;
  2420.  
  2421.             ConfigChanged = TRUE;
  2422.  
  2423.             break;
  2424.  
  2425.         case ATTR_PREFS_MODEM_HANGUPDROPSDTR:
  2426.  
  2427.             Config -> ModemConfig -> DropDTR = Number;
  2428.  
  2429.             ConfigChanged = TRUE;
  2430.  
  2431.             break;
  2432.  
  2433.         case ATTR_PREFS_MODEM_REDIALAFTERHANGUP:
  2434.  
  2435.             Config -> ModemConfig -> RedialAfterHangup = Number;
  2436.  
  2437.             ConfigChanged = TRUE;
  2438.  
  2439.             break;
  2440.  
  2441.         case ATTR_PREFS_MODEM_VERBOSEDIALING:
  2442.  
  2443.             Config -> ModemConfig -> VerboseDialing = Number;
  2444.  
  2445.             ConfigChanged = TRUE;
  2446.  
  2447.             break;
  2448.  
  2449.         case ATTR_PREFS_MODEM_NOCARRIERISBUSY:
  2450.  
  2451.             Config -> ModemConfig -> NoCarrierIsBusy = Number;
  2452.  
  2453.             ConfigChanged = TRUE;
  2454.  
  2455.             break;
  2456.  
  2457.         case ATTR_PREFS_MODEM_CONNECTLIMIT:
  2458.  
  2459.             if(Number > 1440)
  2460.                 Number = 1440;
  2461.  
  2462.             Config -> ModemConfig -> ConnectLimit = Number;
  2463.  
  2464.             ConfigChanged = TRUE;
  2465.  
  2466.             break;
  2467.  
  2468.         case ATTR_PREFS_MODEM_CONNECTLIMITMACRO:
  2469.  
  2470.             strcpy(Config -> ModemConfig -> ConnectLimitMacro,String);
  2471.  
  2472.             ConfigChanged = TRUE;
  2473.  
  2474.             break;
  2475.  
  2476.         case ATTR_PREFS_MODEM_TIME_TO_CONNECT:
  2477.  
  2478.             if(Number >= 0)
  2479.             {
  2480.                 Config -> ModemConfig -> TimeToConnect = Number;
  2481.  
  2482.                 ConfigChanged = TRUE;
  2483.             }
  2484.             else
  2485.                 Error = ERROR_BAD_NUMBER;
  2486.  
  2487.             break;
  2488.  
  2489.         case ATTR_PREFS_COMMANDS_STARTUPMACROTEXT:
  2490.  
  2491.             strcpy(Config -> CommandConfig -> StartupMacro,String);
  2492.  
  2493.             ConfigChanged = TRUE;
  2494.  
  2495.             break;
  2496.  
  2497.         case ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT:
  2498.  
  2499.             strcpy(Config -> CommandConfig -> LogoffMacro,String);
  2500.  
  2501.             ConfigChanged = TRUE;
  2502.  
  2503.             break;
  2504.  
  2505.         case ATTR_PREFS_COMMANDS_UPLOADMACROTEXT:
  2506.  
  2507.             strcpy(Config -> CommandConfig -> UploadMacro,String);
  2508.  
  2509.             ConfigChanged = TRUE;
  2510.  
  2511.             break;
  2512.  
  2513.         case ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT:
  2514.  
  2515.             strcpy(Config -> CommandConfig -> DownloadMacro,String);
  2516.  
  2517.             ConfigChanged = TRUE;
  2518.  
  2519.             break;
  2520.  
  2521.         case ATTR_PREFS_COMMANDS_LOGINMACROTEXT:
  2522.  
  2523.             strcpy(Config -> CommandConfig -> LoginMacro,String);
  2524.  
  2525.             ConfigChanged = TRUE;
  2526.  
  2527.             break;
  2528.  
  2529.         case ATTR_PREFS_SCREEN_COLOURMODE:
  2530.  
  2531.             Config -> ScreenConfig -> ColourMode = Number;
  2532.  
  2533.             UpdateRequired = ConfigChanged = TRUE;
  2534.  
  2535.             Default2CurrentPalette(Config);
  2536.  
  2537.             break;
  2538.  
  2539.         case ATTR_PREFS_SCREEN_FONTNAME:
  2540.  
  2541.             strcpy(Config -> ScreenConfig -> FontName,String);
  2542.  
  2543.             UpdateRequired = ConfigChanged = TRUE;
  2544.  
  2545.             break;
  2546.  
  2547.         case ATTR_PREFS_SCREEN_FONTSIZE:
  2548.  
  2549.             if(Number < 1)
  2550.                 Error = ERROR_BAD_NUMBER;
  2551.             else
  2552.             {
  2553.                 Config -> ScreenConfig -> FontHeight = Number;
  2554.  
  2555.                 UpdateRequired = ConfigChanged = TRUE;
  2556.             }
  2557.  
  2558.             break;
  2559.  
  2560.         case ATTR_PREFS_SCREEN_MAKESCREENPUBLIC:
  2561.  
  2562.             Config -> ScreenConfig -> MakeScreenPublic = Number;
  2563.  
  2564.             UpdateRequired = ConfigChanged = TRUE;
  2565.  
  2566.             break;
  2567.  
  2568.         case ATTR_PREFS_SCREEN_SHANGHAIWINDOWS:
  2569.  
  2570.             Config -> ScreenConfig -> ShanghaiWindows = Number;
  2571.  
  2572.             UpdateRequired = ConfigChanged = TRUE;
  2573.  
  2574.             break;
  2575.  
  2576.         case ATTR_PREFS_SCREEN_BLINKING:
  2577.  
  2578.             Config -> ScreenConfig -> Blinking = Number;
  2579.  
  2580.             UpdateRequired = ConfigChanged = TRUE;
  2581.  
  2582.             break;
  2583.  
  2584.         case ATTR_PREFS_SCREEN_FASTERLAYOUT:
  2585.  
  2586.             Config -> ScreenConfig -> FasterLayout = Number;
  2587.  
  2588.             UpdateRequired = ConfigChanged = TRUE;
  2589.  
  2590.             break;
  2591.  
  2592.         case ATTR_PREFS_SCREEN_TITLEBAR:
  2593.  
  2594.             Config -> ScreenConfig -> TitleBar = Number;
  2595.  
  2596.             UpdateRequired = ConfigChanged = TRUE;
  2597.  
  2598.             break;
  2599.  
  2600.         case ATTR_PREFS_SCREEN_STATUSLINEMODE:
  2601.  
  2602.             Config -> ScreenConfig -> StatusLine = Number;
  2603.  
  2604.             UpdateRequired = ConfigChanged = TRUE;
  2605.  
  2606.             break;
  2607.  
  2608.         case ATTR_PREFS_SCREEN_USEWORKBENCH:
  2609.  
  2610.             Config -> ScreenConfig -> UseWorkbench = Number;
  2611.  
  2612.             UpdateRequired = ConfigChanged = TRUE;
  2613.  
  2614.             break;
  2615.  
  2616.         case ATTR_PREFS_SCREEN_PUBSCREENNAME:
  2617.  
  2618.             strcpy(Config -> ScreenConfig -> PubScreenName,String);
  2619.  
  2620.             UpdateRequired = ConfigChanged = TRUE;
  2621.  
  2622.             break;
  2623.  
  2624.         case ATTR_PREFS_SCREEN_ONLINEDISPLAY:
  2625.  
  2626.             Config -> ScreenConfig -> TimeMode = Number;
  2627.  
  2628.             ConfigChanged = TRUE;
  2629.  
  2630.             break;
  2631.  
  2632.         case ATTR_PREFS_SCREEN_USEPENS:
  2633.  
  2634.             Config -> ScreenConfig -> UsePens = Number;
  2635.  
  2636.             UpdateRequired = ConfigChanged = TRUE;
  2637.  
  2638.             break;
  2639.  
  2640.         case ATTR_PREFS_SCREEN_WINDOW_BORDER:
  2641.  
  2642.             Config -> ScreenConfig -> ShareScreen = Number;
  2643.  
  2644.             UpdateRequired = ConfigChanged = TRUE;
  2645.  
  2646.             break;
  2647.  
  2648.         case ATTR_PREFS_SCREEN_SPLIT_STATUS:
  2649.  
  2650.             Config -> ScreenConfig -> SplitStatus = Number;
  2651.  
  2652.             UpdateRequired = ConfigChanged = TRUE;
  2653.  
  2654.             break;
  2655.  
  2656.         case ATTR_PREFS_TERMINAL_BELLMODE:
  2657.  
  2658.             Config -> TerminalConfig -> BellMode = Number;
  2659.  
  2660.             ConfigChanged = TRUE;
  2661.  
  2662.             break;
  2663.  
  2664.         case ATTR_PREFS_TERMINAL_EMULATIONMODE:
  2665.  
  2666.             Config -> TerminalConfig -> EmulationMode = Number;
  2667.  
  2668.             ConfigChanged = TRUE;
  2669.  
  2670.             break;
  2671.  
  2672.         case ATTR_PREFS_TERMINAL_FONTMODE:
  2673.  
  2674.             Config -> TerminalConfig -> FontMode = Number;
  2675.  
  2676.             ConfigChanged = TRUE;
  2677.  
  2678.             break;
  2679.  
  2680.         case ATTR_PREFS_TERMINAL_SENDCRMODE:
  2681.  
  2682.             Config -> TerminalConfig -> SendCR = Number;
  2683.  
  2684.             ConfigChanged = TRUE;
  2685.  
  2686.             break;
  2687.  
  2688.         case ATTR_PREFS_TERMINAL_SENDLFMODE:
  2689.  
  2690.             Config -> TerminalConfig -> SendLF = Number;
  2691.  
  2692.             ConfigChanged = TRUE;
  2693.  
  2694.             break;
  2695.  
  2696.         case ATTR_PREFS_TERMINAL_RECEIVECRMODE:
  2697.  
  2698.             Config -> TerminalConfig -> ReceiveCR = Number;
  2699.  
  2700.             Update_CR_LF_Translation();
  2701.  
  2702.             ConfigChanged = TRUE;
  2703.  
  2704.             break;
  2705.  
  2706.         case ATTR_PREFS_TERMINAL_RECEIVELFMODE:
  2707.  
  2708.             Config -> TerminalConfig -> ReceiveLF = Number;
  2709.  
  2710.             Update_CR_LF_Translation();
  2711.  
  2712.             ConfigChanged = TRUE;
  2713.  
  2714.             break;
  2715.  
  2716.         case ATTR_PREFS_TERMINAL_NUMCOLUMNS:
  2717.  
  2718.             if(Number < 0)
  2719.                 Number = 0;
  2720.  
  2721.             Config -> TerminalConfig -> NumColumns = Number;
  2722.  
  2723.             UpdateRequired = ConfigChanged = TRUE;
  2724.  
  2725.             break;
  2726.  
  2727.         case ATTR_PREFS_TERMINAL_NUMLINES:
  2728.  
  2729.             if(Number < 0)
  2730.                 Number = 0;
  2731.  
  2732.             Config -> TerminalConfig -> NumLines = Number;
  2733.  
  2734.             UpdateRequired = ConfigChanged = TRUE;
  2735.  
  2736.             break;
  2737.  
  2738.         case ATTR_PREFS_TERMINAL_KEYMAPNAME:
  2739.  
  2740.             strcpy(Config -> TerminalConfig -> KeyMapFileName,String);
  2741.  
  2742.             ConfigChanged = TRUE;
  2743.  
  2744.             break;
  2745.  
  2746.         case ATTR_PREFS_TERMINAL_EMULATIONNAME:
  2747.  
  2748.             strcpy(Config -> TerminalConfig -> EmulationFileName,String);
  2749.  
  2750.             UpdateRequired = ConfigChanged = TRUE;
  2751.  
  2752.             break;
  2753.  
  2754.         case ATTR_PREFS_TERMINAL_FONTNAME:
  2755.  
  2756.             strcpy(Config -> TerminalConfig -> TextFontName,String);
  2757.  
  2758.             UpdateRequired = ConfigChanged = TRUE;
  2759.  
  2760.             break;
  2761.  
  2762.         case ATTR_PREFS_TERMINAL_USETERMINALPROCESS:
  2763.  
  2764.             Config -> TerminalConfig -> UseTerminalTask = Number;
  2765.  
  2766.             UpdateRequired = ConfigChanged = TRUE;
  2767.  
  2768.             break;
  2769.  
  2770.         case ATTR_PREFS_TERMINAL_FONTSIZE:
  2771.  
  2772.             if(Number < 1)
  2773.                 Error = ERROR_BAD_NUMBER;
  2774.             else
  2775.             {
  2776.                 Config -> TerminalConfig -> TextFontHeight = Number;
  2777.  
  2778.                 UpdateRequired = ConfigChanged = TRUE;
  2779.             }
  2780.  
  2781.             break;
  2782.  
  2783.         case ATTR_PREFS_PATHS_ASCIIUPLOADPATH:
  2784.  
  2785.             strcpy(Config -> PathConfig -> ASCIIUploadPath,String);
  2786.  
  2787.             ConfigChanged = TRUE;
  2788.  
  2789.             break;
  2790.  
  2791.         case ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH:
  2792.  
  2793.             strcpy(Config -> PathConfig -> ASCIIDownloadPath,String);
  2794.  
  2795.             ConfigChanged = TRUE;
  2796.  
  2797.             break;
  2798.  
  2799.         case ATTR_PREFS_PATHS_TEXTUPLOADPATH:
  2800.  
  2801.             strcpy(Config -> PathConfig -> TextUploadPath,String);
  2802.  
  2803.             ConfigChanged = TRUE;
  2804.  
  2805.             break;
  2806.  
  2807.         case ATTR_PREFS_PATHS_TEXTDOWNLOADPATH:
  2808.  
  2809.             strcpy(Config -> PathConfig -> TextDownloadPath,String);
  2810.  
  2811.             ConfigChanged = TRUE;
  2812.  
  2813.             break;
  2814.  
  2815.         case ATTR_PREFS_PATHS_BINARYUPLOADPATH:
  2816.  
  2817.             strcpy(Config -> PathConfig -> BinaryUploadPath,String);
  2818.  
  2819.             ConfigChanged = TRUE;
  2820.  
  2821.             break;
  2822.  
  2823.         case ATTR_PREFS_PATHS_BINARYDOWNLOADPATH:
  2824.  
  2825.             strcpy(Config -> PathConfig -> BinaryDownloadPath,String);
  2826.  
  2827.             ConfigChanged = TRUE;
  2828.  
  2829.             break;
  2830.  
  2831.         case ATTR_PREFS_PATHS_CONFIGPATH:
  2832.  
  2833.             strcpy(Config -> PathConfig -> DefaultStorage,String);
  2834.  
  2835.             ConfigChanged = TRUE;
  2836.  
  2837.             break;
  2838.  
  2839.         case ATTR_PREFS_PATHS_EDITORNAME:
  2840.  
  2841.             strcpy(Config -> PathConfig -> Editor,String);
  2842.  
  2843.             ConfigChanged = TRUE;
  2844.  
  2845.             break;
  2846.  
  2847.         case ATTR_PREFS_PATHS_HELPFILENAME:
  2848.  
  2849.             strcpy(Config -> PathConfig -> HelpFile,String);
  2850.  
  2851.             ConfigChanged = TRUE;
  2852.  
  2853.             break;
  2854.  
  2855.         case ATTR_PREFS_MISC_ALERTMODE:
  2856.  
  2857.             Config -> MiscConfig -> AlertMode = Number;
  2858.  
  2859.             ConfigChanged = TRUE;
  2860.  
  2861.             break;
  2862.  
  2863.         case ATTR_PREFS_MISC_REQUESTERMODE:
  2864.  
  2865.             Config -> MiscConfig -> RequesterMode = Number;
  2866.  
  2867.             ConfigChanged = TRUE;
  2868.  
  2869.             break;
  2870.  
  2871.         case ATTR_PREFS_MISC_REQUESTERWIDTH:
  2872.  
  2873.             if(Number < 80)
  2874.                 Number = 80;
  2875.  
  2876.             Config -> MiscConfig -> RequesterWidth = Number;
  2877.  
  2878.             ConfigChanged = TRUE;
  2879.  
  2880.             break;
  2881.  
  2882.         case ATTR_PREFS_MISC_REQUESTERHEIGHT:
  2883.  
  2884.             if(Number < 80)
  2885.                 Number = 80;
  2886.  
  2887.             Config -> MiscConfig -> RequesterHeight = Number;
  2888.  
  2889.             ConfigChanged = TRUE;
  2890.  
  2891.             break;
  2892.  
  2893.         case ATTR_PREFS_MISC_PRIORITY:
  2894.  
  2895.             if(Number < -128)
  2896.                 Number = -128;
  2897.  
  2898.             if(Number > 127)
  2899.                 Number = 127;
  2900.  
  2901.             Config -> MiscConfig -> Priority = Number;
  2902.  
  2903.             UpdateRequired = ConfigChanged = TRUE;
  2904.  
  2905.             break;
  2906.  
  2907.         case ATTR_PREFS_MISC_BACKUPCONFIG:
  2908.  
  2909.             Config -> MiscConfig -> BackupConfig = Number;
  2910.  
  2911.             ConfigChanged = TRUE;
  2912.  
  2913.             break;
  2914.  
  2915.         case ATTR_PREFS_MISC_OVERWRITE_WARNING:
  2916.  
  2917.             Config -> MiscConfig -> ProtectiveMode = Number;
  2918.  
  2919.             ConfigChanged = TRUE;
  2920.  
  2921.             break;
  2922.  
  2923.         case ATTR_PREFS_MISC_OPENFASTMACROPANEL:
  2924.  
  2925.             Config -> MiscConfig -> OpenFastMacroPanel = Number;
  2926.  
  2927.             ConfigChanged = TRUE;
  2928.  
  2929.             break;
  2930.  
  2931.         case ATTR_PREFS_MISC_RELEASEDEVICE:
  2932.  
  2933.             Config -> MiscConfig -> ReleaseDevice = Number;
  2934.  
  2935.             ConfigChanged = TRUE;
  2936.  
  2937.             break;
  2938.  
  2939.         case ATTR_PREFS_TRANSFER_OVERRIDEPATH:
  2940.         case ATTR_PREFS_MISC_OVERRIDEPATH:
  2941.  
  2942.             Config -> TransferConfig -> OverridePath = Number;
  2943.  
  2944.             ConfigChanged = TRUE;
  2945.  
  2946.             break;
  2947.  
  2948.         case ATTR_PREFS_MISC_AUTOUPLOAD:
  2949.  
  2950.             Config -> MiscConfig -> AutoUpload = Number;
  2951.  
  2952.             ConfigChanged = TRUE;
  2953.  
  2954.             break;
  2955.  
  2956.         case ATTR_PREFS_TRANSFER_SETARCHIVEDBIT:
  2957.         case ATTR_PREFS_MISC_SETARCHIVEDBIT:
  2958.  
  2959.             Config -> TransferConfig -> SetArchivedBit = Number;
  2960.  
  2961.             ConfigChanged = TRUE;
  2962.  
  2963.             break;
  2964.  
  2965.         case ATTR_PREFS_TRANSFER_COMMENTMODE:
  2966.         case ATTR_PREFS_MISC_COMMENTMODE:
  2967.  
  2968.             Config -> TransferConfig -> IdentifyFiles = Number;
  2969.  
  2970.             ConfigChanged = TRUE;
  2971.  
  2972.             break;
  2973.  
  2974.         case ATTR_PREFS_MISC_TRANSFERICONS:
  2975.         case ATTR_PREFS_TRANSFER_TRANSFERICONS:
  2976.  
  2977.             Config -> TransferConfig -> TransferIcons = Number;
  2978.  
  2979.             ConfigChanged = TRUE;
  2980.  
  2981.             break;
  2982.  
  2983.         case ATTR_PREFS_MISC_CREATEICONS:
  2984.  
  2985.             Config -> MiscConfig -> CreateIcons = Number;
  2986.  
  2987.             ConfigChanged = TRUE;
  2988.  
  2989.             break;
  2990.  
  2991.         case ATTR_PREFS_MISC_SIMPLEIO:
  2992.  
  2993.             Config -> MiscConfig -> SimpleIO = Number;
  2994.  
  2995.             ConfigChanged = TRUE;
  2996.  
  2997.             break;
  2998.  
  2999.         case ATTR_PREFS_MISC_HIDE_UPLOAD_ICON:
  3000.         case ATTR_PREFS_TRANSFER_HIDE_UPLOAD_ICON:
  3001.  
  3002.             Config -> TransferConfig -> HideUploadIcon = Number;
  3003.  
  3004.             ConfigChanged = TRUE;
  3005.  
  3006.             break;
  3007.  
  3008.         case ATTR_PREFS_MISC_TRANSFER_PERFMETER:
  3009.         case ATTR_PREFS_TRANSFER_TRANSFER_PERFMETER:
  3010.  
  3011.             Config -> TransferConfig -> PerfMeter = Number;
  3012.  
  3013.             ConfigChanged = TRUE;
  3014.  
  3015.             break;
  3016.  
  3017.         case ATTR_PREFS_MISC_IOBUFFERSIZE:
  3018.  
  3019.             if(Number < 1)
  3020.                 Number = 1;
  3021.             else
  3022.             {
  3023.                 if(Number > (1L << 20))
  3024.                     Number = (1L << 20);
  3025.             }
  3026.  
  3027.             for(i = 12 ; i <= 20 ; i++)
  3028.             {
  3029.                 if(Number >= (1L << i) && Number <= (1L << (i + 1)))
  3030.                 {
  3031.                     Number = (1L << i);
  3032.  
  3033.                     break;
  3034.                 }
  3035.             }
  3036.  
  3037.             Config -> MiscConfig -> IOBufferSize = Number;
  3038.  
  3039.             ConfigChanged = TRUE;
  3040.  
  3041.             break;
  3042.  
  3043.         case ATTR_PREFS_CLIPBOARD_UNIT:
  3044.  
  3045.             if(Number < 0)
  3046.                 Error = TERMERROR_UNIT_NOT_AVAILABLE;
  3047.             else
  3048.             {
  3049.                 Config -> ClipConfig -> ClipboardUnit = Number;
  3050.  
  3051.                 ConfigChanged = TRUE;
  3052.             }
  3053.  
  3054.             break;
  3055.  
  3056.         case ATTR_PREFS_CLIPBOARD_LINEDELAY:
  3057.  
  3058.             if(Number < 0)
  3059.                 Error = ERROR_BAD_NUMBER;
  3060.             else
  3061.             {
  3062.                 Config -> ClipConfig -> LineDelay = Number;
  3063.  
  3064.                 ConfigChanged = TRUE;
  3065.             }
  3066.  
  3067.             break;
  3068.  
  3069.         case ATTR_PREFS_CLIPBOARD_CHARDELAY:
  3070.  
  3071.             if(Number < 0)
  3072.                 Error = ERROR_BAD_NUMBER;
  3073.             else
  3074.             {
  3075.                 Config -> ClipConfig -> CharDelay = Number;
  3076.  
  3077.                 ConfigChanged = TRUE;
  3078.             }
  3079.  
  3080.             break;
  3081.  
  3082.         case ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT:
  3083.  
  3084.             strcpy(Config -> ClipConfig -> InsertPrefix,String);
  3085.  
  3086.             ConfigChanged = TRUE;
  3087.  
  3088.             break;
  3089.  
  3090.         case ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT:
  3091.  
  3092.             strcpy(Config -> ClipConfig -> InsertSuffix,String);
  3093.  
  3094.             ConfigChanged = TRUE;
  3095.  
  3096.             break;
  3097.  
  3098.         case ATTR_PREFS_CLIPBOARD_LINEPROMPT:
  3099.  
  3100.             strcpy(Config -> ClipConfig -> LinePrompt,String);
  3101.  
  3102.             ConfigChanged = TRUE;
  3103.  
  3104.             break;
  3105.  
  3106.         case ATTR_PREFS_CLIPBOARD_TEXTPACING:
  3107.  
  3108.             Config -> ClipConfig -> PacingMode = Number;
  3109.  
  3110.             ConfigChanged = TRUE;
  3111.  
  3112.             break;
  3113.  
  3114.         case ATTR_PREFS_CLIPBOARD_SENDTIMEOUT:
  3115.  
  3116.             Config -> ClipConfig -> SendTimeout = Number;
  3117.  
  3118.             ConfigChanged = TRUE;
  3119.  
  3120.             break;
  3121.  
  3122.         case ATTR_PREFS_CLIPBOARD_CONVERTLF:
  3123.  
  3124.             Config -> ClipConfig -> ConvertLF = Number;
  3125.  
  3126.             ConfigChanged = TRUE;
  3127.  
  3128.             break;
  3129.  
  3130.         case ATTR_PREFS_CAPTURE_CONVERTCHARACTERS:
  3131.  
  3132.             Config -> CaptureConfig -> ConvertChars = Number;
  3133.  
  3134.             ConfigChanged = TRUE;
  3135.  
  3136.             break;
  3137.  
  3138.         case ATTR_PREFS_CAPTURE_BUFFERMODE:
  3139.  
  3140.             Config -> CaptureConfig -> BufferMode = Number;
  3141.  
  3142.             ConfigChanged = TRUE;
  3143.  
  3144.             break;
  3145.  
  3146.         case ATTR_PREFS_CAPTURE_LOGACTIONS:
  3147.  
  3148.             Config -> CaptureConfig -> LogActions = Number;
  3149.  
  3150.             ConfigChanged = TRUE;
  3151.  
  3152.             break;
  3153.  
  3154.         case ATTR_PREFS_CAPTURE_LOGCALLS:
  3155.  
  3156.             Config -> CaptureConfig -> LogCall = Number;
  3157.  
  3158.             ConfigChanged = TRUE;
  3159.  
  3160.             break;
  3161.  
  3162.         case ATTR_PREFS_CAPTURE_LOGFILENAME:
  3163.  
  3164.             strcpy(Config -> CaptureConfig -> LogFileName,String);
  3165.  
  3166.             ConfigChanged = TRUE;
  3167.  
  3168.             break;
  3169.  
  3170.         case ATTR_PREFS_CAPTURE_MAXBUFFERSIZE:
  3171.  
  3172.             if(Number < 0)
  3173.                 Number = 0;
  3174.  
  3175.             Config -> CaptureConfig -> MaxBufferSize = Number;
  3176.  
  3177.             ConfigChanged = TRUE;
  3178.  
  3179.             break;
  3180.  
  3181.         case ATTR_PREFS_CAPTURE_BUFFER:
  3182.  
  3183.             Config -> CaptureConfig -> BufferEnabled = Number;
  3184.  
  3185.             ConfigChanged = TRUE;
  3186.  
  3187.             break;
  3188.  
  3189.         case ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE:
  3190.  
  3191.             Config -> CaptureConfig -> ConnectAutoCapture = Number;
  3192.  
  3193.             ConfigChanged = TRUE;
  3194.  
  3195.             break;
  3196.  
  3197.         case ATTR_PREFS_CAPTURE_AUTOCAPTUREDATE:
  3198.  
  3199.             Config -> CaptureConfig -> AutoCaptureDate = Number;
  3200.  
  3201.             ConfigChanged = TRUE;
  3202.  
  3203.             break;
  3204.  
  3205.         case ATTR_PREFS_CAPTURE_CAPTUREFILTER:
  3206.  
  3207.             Config -> CaptureConfig -> CaptureFilterMode = Number;
  3208.  
  3209.             ConfigChanged = TRUE;
  3210.  
  3211.             ConOutputUpdate();
  3212.  
  3213.             break;
  3214.  
  3215.         case ATTR_PREFS_CAPTURE_CAPTUREPATH:
  3216.  
  3217.             strcpy(Config -> CaptureConfig -> CapturePath,String);
  3218.  
  3219.             ConfigChanged = TRUE;
  3220.  
  3221.             break;
  3222.  
  3223.         case ATTR_PREFS_CAPTURE_CALLLOGFILENAME:
  3224.  
  3225.             strcpy(Config -> CaptureConfig -> CallLogFileName,String);
  3226.  
  3227.             ConfigChanged = TRUE;
  3228.  
  3229.             break;
  3230.  
  3231.         case ATTR_PREFS_CAPTURE_BUFFERSAVEPATH:
  3232.  
  3233.             strcpy(Config -> CaptureConfig -> BufferPath,String);
  3234.  
  3235.             ConfigChanged = TRUE;
  3236.  
  3237.             break;
  3238.  
  3239.         case ATTR_PREFS_CAPTURE_OPENBUFFERWINDOW:
  3240.  
  3241.             Config -> CaptureConfig -> OpenBufferWindow = Number;
  3242.  
  3243.             ConfigChanged = TRUE;
  3244.  
  3245.             break;
  3246.  
  3247.         case ATTR_PREFS_CAPTURE_OPENBUFFERSCREEN:
  3248.  
  3249.             Config -> CaptureConfig -> OpenBufferScreen = Number;
  3250.  
  3251.             ConfigChanged = TRUE;
  3252.  
  3253.             break;
  3254.  
  3255.         case ATTR_PREFS_CAPTURE_BUFFERSCREENPOSITION:
  3256.  
  3257.             Config -> CaptureConfig -> BufferScreenPosition = Number;
  3258.  
  3259.             ConfigChanged = TRUE;
  3260.  
  3261.             break;
  3262.  
  3263.         case ATTR_PREFS_CAPTURE_BUFFERWIDTH:
  3264.  
  3265.             if(Number < 80)
  3266.                 Number = 80;
  3267.  
  3268.             if(Number > 255)
  3269.                 Number = 255;
  3270.  
  3271.             Config -> CaptureConfig -> BufferWidth = Number;
  3272.  
  3273.             ConfigChanged = TRUE;
  3274.  
  3275.             break;
  3276.  
  3277.         case ATTR_PREFS_CAPTURE_SEARCH_HISTORY:
  3278.  
  3279.             if(Number < 1)
  3280.                 Number = 1;
  3281.  
  3282.             if(Number > 255)
  3283.                 Number = 255;
  3284.  
  3285.             Config -> CaptureConfig -> SearchHistory = Number;
  3286.  
  3287.             ConfigChanged = TRUE;
  3288.  
  3289.             break;
  3290.  
  3291.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERWINDOW:
  3292.  
  3293.             Config -> CaptureConfig -> RememberBufferWindow = Number;
  3294.  
  3295.             ConfigChanged = TRUE;
  3296.  
  3297.             break;
  3298.  
  3299.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERSCREEN:
  3300.  
  3301.             Config -> CaptureConfig -> RememberBufferScreen = Number;
  3302.  
  3303.             ConfigChanged = TRUE;
  3304.  
  3305.             break;
  3306.  
  3307.         case ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME:
  3308.  
  3309.             strcpy(Config -> TransferConfig -> DefaultLibrary,String);
  3310.  
  3311.             ConfigChanged = TRUE;
  3312.  
  3313.             TransferUpdateRequired = TRUE;
  3314.  
  3315.             break;
  3316.  
  3317.         case ATTR_PREFS_FILE_TRANSLATIONFILENAME:
  3318.  
  3319.             strcpy(Config -> TranslationFileName,String);
  3320.  
  3321.             ConfigChanged = TRUE;
  3322.  
  3323.             break;
  3324.  
  3325.         case ATTR_PREFS_FILE_MACROFILENAME:
  3326.  
  3327.             strcpy(Config -> MacroFileName,String);
  3328.  
  3329.             ConfigChanged = TRUE;
  3330.  
  3331.             break;
  3332.  
  3333.         case ATTR_PREFS_FILE_CURSORFILENAME:
  3334.  
  3335.             strcpy(Config -> CursorFileName,String);
  3336.  
  3337.             ConfigChanged = TRUE;
  3338.  
  3339.             break;
  3340.  
  3341.         case ATTR_PREFS_FILE_FASTMACROFILENAME:
  3342.  
  3343.             strcpy(Config -> FastMacroFileName,String);
  3344.  
  3345.             ConfigChanged = TRUE;
  3346.  
  3347.             break;
  3348.  
  3349.         case ATTR_PREFS_EMULATION_IDENTIFICATION:
  3350.  
  3351.             Config -> EmulationConfig -> TerminalType = Number;
  3352.  
  3353.             ConfigChanged = TRUE;
  3354.  
  3355.             break;
  3356.  
  3357.         case ATTR_PREFS_EMULATION_CURSORMODE:
  3358.  
  3359.             Config -> EmulationConfig -> CursorMode = Number;
  3360.  
  3361.             ConfigChanged = TRUE;
  3362.  
  3363.             break;
  3364.  
  3365.         case ATTR_PREFS_EMULATION_MAXSCROLL:
  3366.  
  3367.             if(Number < 0)
  3368.                 Number = 0;
  3369.             else
  3370.             {
  3371.                 if(Number > 255)
  3372.                     Number = 255;
  3373.             }
  3374.  
  3375.             Config -> EmulationConfig -> MaxScroll = Number;
  3376.  
  3377.             ConfigChanged = TRUE;
  3378.  
  3379.             break;
  3380.  
  3381.         case ATTR_PREFS_EMULATION_MAXJUMP:
  3382.  
  3383.             if(Number < 0)
  3384.                 Number = 0;
  3385.             else
  3386.             {
  3387.                 if(Number > 255)
  3388.                     Number = 255;
  3389.             }
  3390.  
  3391.             Config -> EmulationConfig -> MaxJump = Number;
  3392.  
  3393.             ConfigChanged = TRUE;
  3394.  
  3395.             break;
  3396.  
  3397.         case ATTR_PREFS_EMULATION_NUMERICMODE:
  3398.  
  3399.             Config -> EmulationConfig -> NumericMode = Number;
  3400.  
  3401.             ConfigChanged = TRUE;
  3402.  
  3403.             break;
  3404.  
  3405.         case ATTR_PREFS_EMULATION_CURSORWRAP:
  3406.  
  3407.             Config -> EmulationConfig -> CursorWrap = Number;
  3408.  
  3409.             ConfigChanged = TRUE;
  3410.  
  3411.             break;
  3412.  
  3413.         case ATTR_PREFS_EMULATION_LINEWRAP:
  3414.  
  3415.             Config -> EmulationConfig -> LineWrap = Number;
  3416.  
  3417.             ConfigChanged = TRUE;
  3418.  
  3419.             break;
  3420.  
  3421.         case ATTR_PREFS_EMULATION_INSERTMODE:
  3422.  
  3423.             Config -> EmulationConfig -> InsertMode = Number;
  3424.  
  3425.             ConfigChanged = TRUE;
  3426.  
  3427.             break;
  3428.  
  3429.         case ATTR_PREFS_EMULATION_NEWLINEMODE:
  3430.  
  3431.             Config -> EmulationConfig -> NewLineMode = Number;
  3432.  
  3433.             ConfigChanged = TRUE;
  3434.  
  3435.             break;
  3436. /*    OBSOLETE!
  3437.         case ATTR_PREFS_EMULATION_FONTSCALEMODE:
  3438.  
  3439.             Config -> EmulationConfig -> FontScale = Number;
  3440.  
  3441.             ConFontScaleUpdate();
  3442.  
  3443.             ConfigChanged = TRUE;
  3444.  
  3445.             break;
  3446. */
  3447.         case ATTR_PREFS_EMULATION_SCROLLMODE:
  3448.  
  3449.             Config -> EmulationConfig -> ScrollMode = Number;
  3450.  
  3451.             ConfigChanged = TRUE;
  3452.  
  3453.             break;
  3454.  
  3455.         case ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE:
  3456.  
  3457.             Config -> EmulationConfig -> DestructiveBackspace = Number;
  3458.  
  3459.             ConfigChanged = TRUE;
  3460.  
  3461.             break;
  3462.  
  3463.         case ATTR_PREFS_EMULATION_SWAPBSDELETE:
  3464.  
  3465.             Config -> EmulationConfig -> SwapBSDelete = Number;
  3466.  
  3467.             ConfigChanged = TRUE;
  3468.  
  3469.             break;
  3470.  
  3471.         case ATTR_PREFS_EMULATION_PRINTERENABLED:
  3472.  
  3473.             Config -> EmulationConfig -> PrinterEnabled = Number;
  3474.  
  3475.             ConfigChanged = TRUE;
  3476.  
  3477.             break;
  3478.  
  3479.         case ATTR_PREFS_EMULATION_ANSWERBACKTEXT:
  3480.  
  3481.             strcpy(Config -> EmulationConfig -> AnswerBack,String);
  3482.  
  3483.             ConfigChanged = TRUE;
  3484.  
  3485.             break;
  3486.  
  3487.         case ATTR_PREFS_EMULATION_CLS_RESETS_CURSOR:
  3488.  
  3489.             Config -> EmulationConfig -> CLSResetsCursor = Number;
  3490.  
  3491.             ConfigChanged = TRUE;
  3492.  
  3493.             break;
  3494.  
  3495.         case ATTR_PREFS_EMULATION_NUMPADLOCKED:
  3496.  
  3497.             Config -> EmulationConfig -> KeysLocked = Number;
  3498.  
  3499.             ConfigChanged = TRUE;
  3500.  
  3501.             break;
  3502.  
  3503.         case ATTR_PREFS_EMULATION_WRAPLOCKED:
  3504.  
  3505.             Config -> EmulationConfig -> LockWrapping = Number;
  3506.  
  3507.             ConfigChanged = TRUE;
  3508.  
  3509.             break;
  3510.  
  3511.         case ATTR_PREFS_EMULATION_FONTLOCKED:
  3512.  
  3513.             Config -> EmulationConfig -> FontLocked = Number;
  3514.  
  3515.             ConfigChanged = TRUE;
  3516.  
  3517.             break;
  3518.  
  3519.         case ATTR_PREFS_EMULATION_CURSORLOCKED:
  3520.  
  3521.             Config -> EmulationConfig -> CursorLocked = Number;
  3522.  
  3523.             ConfigChanged = TRUE;
  3524.  
  3525.             break;
  3526.  
  3527.         case ATTR_PREFS_EMULATION_STYLELOCKED:
  3528.  
  3529.             Config -> EmulationConfig -> LockStyle = Number;
  3530.  
  3531.             ConfigChanged = TRUE;
  3532.  
  3533.             break;
  3534.  
  3535.         case ATTR_PREFS_EMULATION_COLOURLOCKED:
  3536.  
  3537.             Config -> EmulationConfig -> LockColour = Number;
  3538.  
  3539.             ConfigChanged = TRUE;
  3540.  
  3541.             break;
  3542.  
  3543.         case ATTR_PREFS_EMULATION_USEPENS:
  3544.  
  3545.             Config -> EmulationConfig -> UseStandardPens = Number;
  3546.  
  3547.             UpdateRequired = ConfigChanged = TRUE;
  3548.  
  3549.             break;
  3550.  
  3551.         case ATTR_PREFS_TRANSFER_DEFAULT_LIBRARY:
  3552.  
  3553.             strcpy(Config -> TransferConfig -> DefaultLibrary,String);
  3554.  
  3555.             ConfigChanged = TRUE;
  3556.  
  3557.             TransferUpdateRequired = TRUE;
  3558.  
  3559.             break;
  3560.  
  3561.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_LIBRARY:
  3562.  
  3563.             strcpy(Config -> TransferConfig -> ASCIIUploadLibrary,String);
  3564.  
  3565.             UpdateRequired = ConfigChanged = TRUE;
  3566.  
  3567.             break;
  3568.  
  3569.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_LIBRARY:
  3570.  
  3571.             strcpy(Config -> TransferConfig -> ASCIIDownloadLibrary,String);
  3572.  
  3573.             UpdateRequired = ConfigChanged = TRUE;
  3574.  
  3575.             break;
  3576.  
  3577.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_LIBRARY:
  3578.  
  3579.             strcpy(Config -> TransferConfig -> TextUploadLibrary,String);
  3580.  
  3581.             UpdateRequired = ConfigChanged = TRUE;
  3582.  
  3583.             break;
  3584.  
  3585.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_LIBRARY:
  3586.  
  3587.             strcpy(Config -> TransferConfig -> TextDownloadLibrary,String);
  3588.  
  3589.             UpdateRequired = ConfigChanged = TRUE;
  3590.  
  3591.             break;
  3592.  
  3593.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_LIBRARY:
  3594.  
  3595.             strcpy(Config -> TransferConfig -> BinaryUploadLibrary,String);
  3596.  
  3597.             UpdateRequired = ConfigChanged = TRUE;
  3598.  
  3599.             break;
  3600.  
  3601.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_LIBRARY:
  3602.  
  3603.             strcpy(Config -> TransferConfig -> BinaryDownloadLibrary,String);
  3604.  
  3605.             UpdateRequired = ConfigChanged = TRUE;
  3606.  
  3607.             break;
  3608.  
  3609.         case ATTR_PREFS_TRANSFER_QUIET_TRANSFER:
  3610.  
  3611.             Config -> TransferConfig -> QuietTransfer = Number;
  3612.  
  3613.             ConfigChanged = TRUE;
  3614.  
  3615.             break;
  3616.  
  3617.         case ATTR_PREFS_TRANSFER_MANGLE_FILE_NAMES:
  3618.  
  3619.             Config -> TransferConfig -> MangleFileNames = Number;
  3620.  
  3621.             ConfigChanged = TRUE;
  3622.  
  3623.             break;
  3624.  
  3625.         case ATTR_PREFS_TRANSFER_STRIP_BIT_8:
  3626.  
  3627.             Config -> TransferConfig -> StripBit8 = Number;
  3628.  
  3629.             ConfigChanged = TRUE;
  3630.  
  3631.             break;
  3632.  
  3633.         case ATTR_PREFS_TRANSFER_IGNORE_DATA_PAST_ARNOLD:
  3634.  
  3635.             Config -> TransferConfig -> IgnoreDataPastArnold = Number;
  3636.  
  3637.             ConfigChanged = TRUE;
  3638.  
  3639.             break;
  3640.  
  3641.         case ATTR_PREFS_TRANSFER_TERMINATOR_CHAR:
  3642.  
  3643.             if(Number < 0)
  3644.                 Number = 0;
  3645.             else
  3646.             {
  3647.                 if(Number > 255)
  3648.                     Number = 255;
  3649.             }
  3650.  
  3651.             Config -> TransferConfig -> TerminatorChar = Number;
  3652.  
  3653.             ConfigChanged = TRUE;
  3654.  
  3655.             break;
  3656.  
  3657.         case ATTR_PREFS_TRANSFER_LINEDELAY:
  3658.  
  3659.             if(Number < 0)
  3660.                 Error = ERROR_BAD_NUMBER;
  3661.             else
  3662.             {
  3663.                 Config -> TransferConfig -> LineDelay = Number;
  3664.  
  3665.                 ConfigChanged = TRUE;
  3666.             }
  3667.  
  3668.             break;
  3669.  
  3670.         case ATTR_PREFS_TRANSFER_CHARDELAY:
  3671.  
  3672.             if(Number < 0)
  3673.                 Error = ERROR_BAD_NUMBER;
  3674.             else
  3675.             {
  3676.                 Config -> TransferConfig -> CharDelay = Number;
  3677.  
  3678.                 ConfigChanged = TRUE;
  3679.             }
  3680.  
  3681.             break;
  3682.  
  3683.         case ATTR_PREFS_TRANSFER_LINEPROMPT:
  3684.  
  3685.             strcpy(Config -> TransferConfig -> LinePrompt,String);
  3686.  
  3687.             ConfigChanged = TRUE;
  3688.  
  3689.             break;
  3690.  
  3691.         case ATTR_PREFS_TRANSFER_TEXTPACING:
  3692.  
  3693.             Config -> TransferConfig -> PacingMode = Number;
  3694.  
  3695.             ConfigChanged = TRUE;
  3696.  
  3697.             break;
  3698.  
  3699.         case ATTR_PREFS_TRANSFER_SENDTIMEOUT:
  3700.  
  3701.             Config -> TransferConfig -> SendTimeout = Number;
  3702.  
  3703.             ConfigChanged = TRUE;
  3704.  
  3705.             break;
  3706.  
  3707.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_COUNT:
  3708.  
  3709.             Config -> TransferConfig -> ErrorNotification = Number;
  3710.  
  3711.             ConfigChanged = TRUE;
  3712.  
  3713.             break;
  3714.  
  3715.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_WHEN:
  3716.  
  3717.             Config -> TransferConfig -> TransferNotification = Number;
  3718.  
  3719.             ConfigChanged = TRUE;
  3720.  
  3721.             break;
  3722.  
  3723.         case ATTR_PREFS_TRANSFER_DEFAULT_TYPE:
  3724.  
  3725.             Config -> TransferConfig -> DefaultType = Number;
  3726.  
  3727.             ConfigChanged    = TRUE;
  3728.             UpdateRequired    = TRUE;
  3729.  
  3730.             break;
  3731.  
  3732.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_TYPE:
  3733.  
  3734.             Config -> TransferConfig -> ASCIIUploadType = Number;
  3735.  
  3736.             ConfigChanged    = TRUE;
  3737.             UpdateRequired    = TRUE;
  3738.  
  3739.             break;
  3740.  
  3741.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_TYPE:
  3742.  
  3743.             Config -> TransferConfig -> ASCIIDownloadType = Number;
  3744.  
  3745.             ConfigChanged    = TRUE;
  3746.             UpdateRequired    = TRUE;
  3747.  
  3748.             break;
  3749.  
  3750.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_TYPE:
  3751.  
  3752.             Config -> TransferConfig -> TextUploadType = Number;
  3753.  
  3754.             ConfigChanged    = TRUE;
  3755.             UpdateRequired    = TRUE;
  3756.  
  3757.             break;
  3758.  
  3759.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_TYPE:
  3760.  
  3761.             Config -> TransferConfig -> TextDownloadType = Number;
  3762.  
  3763.             ConfigChanged    = TRUE;
  3764.             UpdateRequired    = TRUE;
  3765.  
  3766.             break;
  3767.  
  3768.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_TYPE:
  3769.  
  3770.             Config -> TransferConfig -> BinaryUploadType = Number;
  3771.  
  3772.             ConfigChanged    = TRUE;
  3773.             UpdateRequired    = TRUE;
  3774.  
  3775.             break;
  3776.  
  3777.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_TYPE:
  3778.  
  3779.             Config -> TransferConfig -> BinaryDownloadType = Number;
  3780.  
  3781.             ConfigChanged    = TRUE;
  3782.             UpdateRequired    = TRUE;
  3783.  
  3784.             break;
  3785.  
  3786.         case ATTR_PREFS_TRANSFER_DEFAULT_SEND_SIGNATURE:
  3787.  
  3788.             Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTUPLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTUPLOAD] . Signature);
  3789.  
  3790.             ConfigChanged    = TRUE;
  3791.             UpdateRequired    = TRUE;
  3792.  
  3793.             break;
  3794.  
  3795.         case ATTR_PREFS_TRANSFER_DEFAULT_RECEIVE_SIGNATURE:
  3796.  
  3797.             Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTDOWNLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTDOWNLOAD] . Signature);
  3798.  
  3799.             ConfigChanged    = TRUE;
  3800.             UpdateRequired    = TRUE;
  3801.  
  3802.             break;
  3803.  
  3804.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_SIGNATURE:
  3805.  
  3806.             Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTUPLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTUPLOAD] . Signature);
  3807.  
  3808.             ConfigChanged    = TRUE;
  3809.             UpdateRequired    = TRUE;
  3810.  
  3811.             break;
  3812.  
  3813.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_SIGNATURE:
  3814.  
  3815.             Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTDOWNLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTDOWNLOAD] . Signature);
  3816.  
  3817.             ConfigChanged    = TRUE;
  3818.             UpdateRequired    = TRUE;
  3819.  
  3820.             break;
  3821.  
  3822.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_SIGNATURE:
  3823.  
  3824.             Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYUPLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYUPLOAD] . Signature);
  3825.  
  3826.             ConfigChanged    = TRUE;
  3827.             UpdateRequired    = TRUE;
  3828.  
  3829.             break;
  3830.  
  3831.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_SIGNATURE:
  3832.  
  3833.             Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYDOWNLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYDOWNLOAD] . Signature);
  3834.  
  3835.             ConfigChanged    = TRUE;
  3836.             UpdateRequired    = TRUE;
  3837.  
  3838.             break;
  3839.  
  3840.         case ATTR_PREFS_SPEECH_RATE:
  3841.  
  3842.             if(Number < MINRATE)
  3843.                 Number = MINRATE;
  3844.  
  3845.             if(Number > MAXRATE)
  3846.                 Number = MAXRATE;
  3847.  
  3848.             SpeechConfig . Rate = Number;
  3849.  
  3850.             SpeechChanged = TRUE;
  3851.  
  3852.             break;
  3853.  
  3854.         case ATTR_PREFS_SPEECH_PITCH:
  3855.  
  3856.             if(Number < MINPITCH)
  3857.                 Number = MINPITCH;
  3858.  
  3859.             if(Number > MAXPITCH)
  3860.                 Number = MAXPITCH;
  3861.  
  3862.             SpeechConfig . Pitch = Number;
  3863.  
  3864.             SpeechChanged = TRUE;
  3865.  
  3866.             break;
  3867.  
  3868.         case ATTR_PREFS_SPEECH_FREQUENCY:
  3869.  
  3870.             if(Number < MINFREQ)
  3871.                 Number = MINFREQ;
  3872.  
  3873.             if(Number > MAXFREQ)
  3874.                 Number = MAXFREQ;
  3875.  
  3876.             SpeechConfig . Frequency = Number;
  3877.  
  3878.             SpeechChanged = TRUE;
  3879.  
  3880.             break;
  3881.  
  3882.         case ATTR_PREFS_SPEECH_SEXMODE:
  3883.  
  3884.             SpeechConfig . Sex = Number;
  3885.  
  3886.             SpeechChanged = TRUE;
  3887.  
  3888.             break;
  3889.  
  3890.         case ATTR_PREFS_SPEECH_VOLUME:
  3891.  
  3892.             if(Number < 0)
  3893.                 Number = 0;
  3894.  
  3895.             Number = (64 * Number) / 100;
  3896.  
  3897.             if(Number > 64)
  3898.                 Number = 64;
  3899.  
  3900.             SpeechConfig . Volume = Number;
  3901.  
  3902.             SpeechChanged = TRUE;
  3903.  
  3904.             break;
  3905.  
  3906.         case ATTR_PREFS_SPEECH_SPEECH:
  3907.  
  3908.             SpeechConfig . Enabled = Number;
  3909.  
  3910.             SpeechChanged = TRUE;
  3911.  
  3912.             break;
  3913.  
  3914.         case ATTR_PREFS_TRANSLATIONS_X_SEND:
  3915.  
  3916.             if(Count1 < 0 || Count1 > 255)
  3917.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  3918.             else
  3919.             {
  3920.                 if(SendTable && *String)
  3921.                 {
  3922.                     struct TranslationEntry *Entry = AllocTranslationEntry(String);
  3923.  
  3924.                     if(Entry)
  3925.                     {
  3926.                         if(SendTable[Count1])
  3927.                             FreeTranslationEntry(SendTable[Count1]);
  3928.  
  3929.                         SendTable[Count1] = Entry;
  3930.  
  3931.                         TranslationChanged = TRUE;
  3932.                     }
  3933.                     else
  3934.                         Error = ERROR_NO_FREE_STORE;
  3935.                 }
  3936.                 else
  3937.                     Error = TERMERROR_NO_DATA_TO_PROCESS;
  3938.             }
  3939.  
  3940.             UpdateRequired = FALSE;
  3941.  
  3942.             break;
  3943.  
  3944.         case ATTR_PREFS_TRANSLATIONS_X_RECEIVE:
  3945.  
  3946.             if(Count1 < 0 || Count1 > 255)
  3947.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  3948.             else
  3949.             {
  3950.                 if(ReceiveTable && *String)
  3951.                 {
  3952.                     struct TranslationEntry *Entry = AllocTranslationEntry(String);
  3953.  
  3954.                     if(Entry)
  3955.                     {
  3956.                         if(ReceiveTable[Count1])
  3957.                             FreeTranslationEntry(ReceiveTable[Count1]);
  3958.  
  3959.                         ReceiveTable[Count1] = Entry;
  3960.  
  3961.                         TranslationChanged = TRUE;
  3962.                     }
  3963.                     else
  3964.                         Error = ERROR_NO_FREE_STORE;
  3965.                 }
  3966.                 else
  3967.                     Error = TERMERROR_NO_DATA_TO_PROCESS;
  3968.             }
  3969.  
  3970.             UpdateRequired = FALSE;
  3971.  
  3972.             break;
  3973.  
  3974.         case ATTR_PREFS_FASTMACROS_X_NAME:
  3975.  
  3976.             if(Count1 < FastMacroCount && Count1 >= 0)
  3977.             {
  3978.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  3979.  
  3980.                 strcpy(Node -> mn_Macro,String);
  3981.  
  3982.                 FastMacrosChanged = TRUE;
  3983.             }
  3984.             else
  3985.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  3986.  
  3987.             UpdateRequired = FALSE;
  3988.  
  3989.             break;
  3990.  
  3991.         case ATTR_PREFS_FASTMACROS_X_CODE:
  3992.  
  3993.             if(Count1 < FastMacroCount && Count1 >= 0)
  3994.             {
  3995.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  3996.  
  3997.                 strcpy(Node -> mn_Code,String);
  3998.  
  3999.                 FastMacrosChanged = TRUE;
  4000.             }
  4001.             else
  4002.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4003.  
  4004.             UpdateRequired = FALSE;
  4005.  
  4006.             break;
  4007.  
  4008.         case ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT:
  4009.  
  4010.             strcpy(Hotkeys . termScreenToFront,String);
  4011.  
  4012.             HotkeysChanged = TRUE;
  4013.  
  4014.             break;
  4015.  
  4016.         case ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT:
  4017.  
  4018.             strcpy(Hotkeys . BufferScreenToFront,String);
  4019.  
  4020.             HotkeysChanged = TRUE;
  4021.  
  4022.             break;
  4023.  
  4024.         case ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT:
  4025.  
  4026.             strcpy(Hotkeys . SkipDialEntry,String);
  4027.  
  4028.             HotkeysChanged = TRUE;
  4029.  
  4030.             break;
  4031.  
  4032.         case ATTR_PREFS_HOTKEYS_ABORTAREXX:
  4033.  
  4034.             strcpy(Hotkeys . AbortARexx,String);
  4035.  
  4036.             HotkeysChanged = TRUE;
  4037.  
  4038.             break;
  4039.  
  4040.         case ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY:
  4041.  
  4042.             if(Number < -128)
  4043.                 Number = -128;
  4044.  
  4045.             if(Number > 127)
  4046.                 Number = 127;
  4047.  
  4048.             Hotkeys . CommodityPriority = Number;
  4049.  
  4050.             HotkeysChanged = TRUE;
  4051.  
  4052.             break;
  4053.  
  4054.         case ATTR_PREFS_HOTKEYS_HOTKEYSENABLED:
  4055.  
  4056.             Hotkeys . HotkeysEnabled = Number;
  4057.  
  4058.             HotkeysChanged = TRUE;
  4059.  
  4060.             break;
  4061.  
  4062.         case ATTR_PREFS_CURSORKEYS_UPTEXT:
  4063.  
  4064.             strcpy(CursorKeys -> Keys[0][0],String);
  4065.  
  4066.             CursorKeysChanged = TRUE;
  4067.  
  4068.             UpdateRequired = FALSE;
  4069.  
  4070.             break;
  4071.  
  4072.         case ATTR_PREFS_CURSORKEYS_RIGHTTEXT:
  4073.  
  4074.             strcpy(CursorKeys -> Keys[0][1],String);
  4075.  
  4076.             CursorKeysChanged = TRUE;
  4077.  
  4078.             UpdateRequired = FALSE;
  4079.  
  4080.             break;
  4081.  
  4082.         case ATTR_PREFS_CURSORKEYS_DOWNTEXT:
  4083.  
  4084.             strcpy(CursorKeys -> Keys[0][2],String);
  4085.  
  4086.             CursorKeysChanged = TRUE;
  4087.  
  4088.             UpdateRequired = FALSE;
  4089.  
  4090.             break;
  4091.  
  4092.         case ATTR_PREFS_CURSORKEYS_LEFTTEXT:
  4093.  
  4094.             strcpy(CursorKeys -> Keys[0][3],String);
  4095.  
  4096.             CursorKeysChanged = TRUE;
  4097.  
  4098.             UpdateRequired = FALSE;
  4099.  
  4100.             break;
  4101.  
  4102.         case ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT:
  4103.  
  4104.             strcpy(CursorKeys -> Keys[1][0],String);
  4105.  
  4106.             CursorKeysChanged = TRUE;
  4107.  
  4108.             UpdateRequired = FALSE;
  4109.  
  4110.             break;
  4111.  
  4112.         case ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT:
  4113.  
  4114.             strcpy(CursorKeys -> Keys[1][1],String);
  4115.  
  4116.             CursorKeysChanged = TRUE;
  4117.  
  4118.             UpdateRequired = FALSE;
  4119.  
  4120.             break;
  4121.  
  4122.         case ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT:
  4123.  
  4124.             strcpy(CursorKeys -> Keys[1][2],String);
  4125.  
  4126.             CursorKeysChanged = TRUE;
  4127.  
  4128.             UpdateRequired = FALSE;
  4129.  
  4130.             break;
  4131.  
  4132.         case ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT:
  4133.  
  4134.             strcpy(CursorKeys -> Keys[1][3],String);
  4135.  
  4136.             CursorKeysChanged = TRUE;
  4137.  
  4138.             UpdateRequired = FALSE;
  4139.  
  4140.             break;
  4141.  
  4142.         case ATTR_PREFS_CURSORKEYS_ALT_UPTEXT:
  4143.  
  4144.             strcpy(CursorKeys -> Keys[2][0],String);
  4145.  
  4146.             CursorKeysChanged = TRUE;
  4147.  
  4148.             UpdateRequired = FALSE;
  4149.  
  4150.             break;
  4151.  
  4152.         case ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT:
  4153.  
  4154.             strcpy(CursorKeys -> Keys[2][1],String);
  4155.  
  4156.             CursorKeysChanged = TRUE;
  4157.  
  4158.             UpdateRequired = FALSE;
  4159.  
  4160.             break;
  4161.  
  4162.         case ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT:
  4163.  
  4164.             strcpy(CursorKeys -> Keys[2][2],String);
  4165.  
  4166.             CursorKeysChanged = TRUE;
  4167.  
  4168.             UpdateRequired = FALSE;
  4169.  
  4170.             break;
  4171.  
  4172.         case ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT:
  4173.  
  4174.             strcpy(CursorKeys -> Keys[2][3],String);
  4175.  
  4176.             CursorKeysChanged = TRUE;
  4177.  
  4178.             UpdateRequired = FALSE;
  4179.  
  4180.             break;
  4181.  
  4182.         case ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT:
  4183.  
  4184.             strcpy(CursorKeys -> Keys[3][0],String);
  4185.  
  4186.             CursorKeysChanged = TRUE;
  4187.  
  4188.             UpdateRequired = FALSE;
  4189.  
  4190.             break;
  4191.  
  4192.         case ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT:
  4193.  
  4194.             strcpy(CursorKeys -> Keys[3][1],String);
  4195.  
  4196.             CursorKeysChanged = TRUE;
  4197.  
  4198.             UpdateRequired = FALSE;
  4199.  
  4200.             break;
  4201.  
  4202.         case ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT:
  4203.  
  4204.             strcpy(CursorKeys -> Keys[3][2],String);
  4205.  
  4206.             CursorKeysChanged = TRUE;
  4207.  
  4208.             UpdateRequired = FALSE;
  4209.  
  4210.             break;
  4211.  
  4212.         case ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT:
  4213.  
  4214.             strcpy(CursorKeys -> Keys[3][3],String);
  4215.  
  4216.             CursorKeysChanged = TRUE;
  4217.  
  4218.             UpdateRequired = FALSE;
  4219.  
  4220.             break;
  4221.  
  4222.         case ATTR_PREFS_FUNCTIONKEYS_X:
  4223.  
  4224.             if(Count1 >= 1 && Count1 <= 10)
  4225.             {
  4226.                 strcpy(MacroKeys -> Keys[0][Count1 - 1],String);
  4227.  
  4228.                 MacroChanged = TRUE;
  4229.             }
  4230.             else
  4231.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4232.  
  4233.             UpdateRequired = FALSE;
  4234.  
  4235.             break;
  4236.  
  4237.         case ATTR_PREFS_FUNCTIONKEYS_SHIFT_X:
  4238.  
  4239.             if(Count1 >= 1 && Count1 <= 10)
  4240.             {
  4241.                 strcpy(MacroKeys -> Keys[1][Count1 - 1],String);
  4242.  
  4243.                 MacroChanged = TRUE;
  4244.             }
  4245.             else
  4246.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4247.  
  4248.             UpdateRequired = FALSE;
  4249.  
  4250.             break;
  4251.  
  4252.         case ATTR_PREFS_FUNCTIONKEYS_ALT_X:
  4253.  
  4254.             if(Count1 >= 1 && Count1 <= 10)
  4255.             {
  4256.                 strcpy(MacroKeys -> Keys[2][Count1 - 1],String);
  4257.  
  4258.                 MacroChanged = TRUE;
  4259.             }
  4260.             else
  4261.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4262.  
  4263.             UpdateRequired = FALSE;
  4264.  
  4265.             break;
  4266.  
  4267.         case ATTR_PREFS_FUNCTIONKEYS_CONTROL_X:
  4268.  
  4269.             if(Count1 >= 1 && Count1 <= 10)
  4270.             {
  4271.                 strcpy(MacroKeys -> Keys[3][Count1 - 1],String);
  4272.  
  4273.                 MacroChanged = TRUE;
  4274.             }
  4275.             else
  4276.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4277.  
  4278.             UpdateRequired = FALSE;
  4279.  
  4280.             break;
  4281.  
  4282.         case ATTR_PREFS_PROTOCOL:
  4283.  
  4284.             strcpy(ProtocolOptsBuffer,String);
  4285.  
  4286.             TransferUpdateRequired = TRUE;
  4287.  
  4288.             UpdateRequired = FALSE;
  4289.  
  4290.             break;
  4291.  
  4292.         case ATTR_PREFS_CONSOLE:
  4293.  
  4294.             strcpy(WindowName,String);
  4295.  
  4296.             UpdateRequired = FALSE;
  4297.  
  4298.             break;
  4299.  
  4300.         case ATTR_PREFS_SOUND_BELLNAME:
  4301.  
  4302.             strcpy(SoundConfig . BellFile,String);
  4303.  
  4304.             SoundChanged = TRUE;
  4305.  
  4306.             break;
  4307.  
  4308.         case ATTR_PREFS_SOUND_ERROR:
  4309.  
  4310.             strcpy(SoundConfig . ErrorNotifyFile,String);
  4311.  
  4312.             SoundChanged = TRUE;
  4313.  
  4314.             break;
  4315.  
  4316.         case ATTR_PREFS_SOUND_CONNECTNAME:
  4317.  
  4318.             strcpy(SoundConfig . ConnectFile,String);
  4319.  
  4320.             SoundChanged = TRUE;
  4321.  
  4322.             break;
  4323.  
  4324.         case ATTR_PREFS_SOUND_DISCONNECTNAME:
  4325.  
  4326.             strcpy(SoundConfig . DisconnectFile,String);
  4327.  
  4328.             SoundChanged = TRUE;
  4329.  
  4330.             break;
  4331.  
  4332.         case ATTR_PREFS_SOUND_GOODTRANSFERNAME:
  4333.  
  4334.             strcpy(SoundConfig . GoodTransferFile,String);
  4335.  
  4336.             SoundChanged = TRUE;
  4337.  
  4338.             break;
  4339.  
  4340.         case ATTR_PREFS_SOUND_BADTRANSFERNAME:
  4341.  
  4342.             strcpy(SoundConfig . BadTransferFile,String);
  4343.  
  4344.             SoundChanged = TRUE;
  4345.  
  4346.             break;
  4347.  
  4348.         case ATTR_PREFS_SOUND_RINGNAME:
  4349.  
  4350.             strcpy(SoundConfig . RingFile,String);
  4351.  
  4352.             SoundChanged = TRUE;
  4353.  
  4354.             break;
  4355.  
  4356.         case ATTR_PREFS_SOUND_VOICENAME:
  4357.  
  4358.             strcpy(SoundConfig . VoiceFile,String);
  4359.  
  4360.             SoundChanged = TRUE;
  4361.  
  4362.             break;
  4363.  
  4364.         case ATTR_PREFS_SOUND_PRELOAD:
  4365.  
  4366.             SoundConfig . Preload = Number;
  4367.  
  4368.             SoundChanged = TRUE;
  4369.  
  4370.             break;
  4371.  
  4372.         case ATTR_PREFS_SOUND_VOLUME:
  4373.  
  4374.             if(Number < 0)
  4375.                 Number = 0;
  4376.             else
  4377.             {
  4378.                 if(Number > 100)
  4379.                     Number = 100;
  4380.             }
  4381.  
  4382.             SoundConfig . Volume = Number;
  4383.  
  4384.             SoundChanged = TRUE;
  4385.  
  4386.             break;
  4387.     }
  4388.  
  4389.     if(Error)
  4390.         UpdateRequired = FALSE;
  4391.  
  4392.     return(Error);
  4393. }
  4394.  
  4395.     /* Cheap shortcut :-) */
  4396.  
  4397. #define Args    Pkt -> Array
  4398. #define Results    Pkt -> Results
  4399.  
  4400.     /* RexxGetAttr(struct RexxPkt *Pkt):
  4401.      *
  4402.      *    Get some global variable(s). Care to rewrite this beastie to
  4403.      *    work recursively?
  4404.      */
  4405.  
  4406. STRPTR
  4407. RexxGetAttr(struct RexxPkt *Pkt)
  4408. {
  4409.     enum    {    ARG_GETATTR_OBJECT,ARG_GETATTR_FIELD,ARG_GETATTR_STEM,
  4410.             ARG_GETATTR_VAR };
  4411.  
  4412.     UBYTE SrcName[160];
  4413.     WORD Index,Count1,Count2;
  4414.  
  4415.     if(Args[ARG_GETATTR_FIELD])
  4416.         SPrintf(SrcName,"%s.%s",Args[ARG_GETATTR_OBJECT],Args[ARG_GETATTR_FIELD]);
  4417.     else
  4418.         strcpy(SrcName,Args[ARG_GETATTR_OBJECT]);
  4419.  
  4420.     if((Index = ToIndex(SrcName,&Count1,&Count2)) == -1)
  4421.     {
  4422.         Results[0] = RC_ERROR;
  4423.         Results[1] = TERMERROR_UNKNOWN_OBJECT;
  4424.     }
  4425.     else
  4426.     {
  4427.         UBYTE DstName[160];
  4428.  
  4429.         if(AttributeTable[Index] . Type == INFO_STEM)
  4430.         {
  4431.             if(!Args[ARG_GETATTR_STEM])
  4432.             {
  4433.                 Results[0] = RC_ERROR;
  4434.                 Results[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  4435.             }
  4436.             else
  4437.             {
  4438.                 STRPTR    Result;
  4439.                 LONG    Level,Max,Min = 0;
  4440.  
  4441.                 strcpy(DstName,Args[ARG_GETATTR_STEM]);
  4442.  
  4443.                 Level = AttributeTable[Index] . Level;
  4444.  
  4445.                 do
  4446.                 {
  4447.                     if(AttributeTable[Index] . Name)
  4448.                     {
  4449.                         if(AttributeTable[Index] . Type != INFO_STEM)
  4450.                         {
  4451.                             Forbid();
  4452.  
  4453.                             if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  4454.                             {
  4455.                                 Results[0] = RC_ERROR;
  4456.  
  4457.                                 Permit();
  4458.  
  4459.                                 break;
  4460.                             }
  4461.                             else
  4462.                             {
  4463.                                 if(!AttributeTable[Index + 1] . Name)
  4464.                                     Max = Atol(Result);
  4465.  
  4466.                                 if(!CreateVarArgs(Result,Pkt,"%s.%s",DstName,FromIndex(Index,Count1,0,FALSE)))
  4467.                                 {
  4468.                                     Permit();
  4469.  
  4470.                                     break;
  4471.                                 }
  4472.                             }
  4473.  
  4474.                             Permit();
  4475.                         }
  4476.                         else
  4477.                         {
  4478.                             if(!AttributeTable[Index + 1] . Name)
  4479.                             {
  4480.                                     /* Special cases! */
  4481.  
  4482.                                 switch(AttributeTable[Index] . NodeID)
  4483.                                 {
  4484.                                     case ATTR_PREFS_TRANSLATIONS:
  4485.  
  4486.                                         Max = 256;
  4487.                                         break;
  4488.  
  4489.                                     case ATTR_PREFS_FUNCTIONKEYS:
  4490.                                     case ATTR_PREFS_FUNCTIONKEYS_SHIFT:
  4491.                                     case ATTR_PREFS_FUNCTIONKEYS_ALT:
  4492.                                     case ATTR_PREFS_FUNCTIONKEYS_CONTROL:
  4493.  
  4494.                                         Max = 11;
  4495.                                         Min = 1;
  4496.                                         break;
  4497.  
  4498.                                     default:
  4499.  
  4500.                                         Forbid();
  4501.  
  4502.                                         if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  4503.                                         {
  4504.                                             Permit();
  4505.  
  4506.                                             Results[0] = RC_ERROR;
  4507.  
  4508.                                             break;
  4509.                                         }
  4510.                                         else
  4511.                                             Max = Atol(Result);
  4512.  
  4513.                                         Permit();
  4514.  
  4515.                                         break;
  4516.                                 }
  4517.                             }
  4518.                         }
  4519.                     }
  4520.                     else
  4521.                     {
  4522.                         LONG i,j;
  4523.  
  4524.                         for(i = Min ; i < Max ; i++)
  4525.                         {
  4526.                             j = 0;
  4527.  
  4528.                             do
  4529.                             {
  4530.                                 if(AttributeTable[Index + j] . Type != INFO_STEM)
  4531.                                 {
  4532.                                     Forbid();
  4533.  
  4534.                                     if(Results[1] = GetSingleAttribute(AttributeTable[Index + j] . NodeID,Index + j,i,&Result))
  4535.                                     {
  4536.                                         Permit();
  4537.  
  4538.                                         Results[0] = RC_ERROR;
  4539.  
  4540.                                         break;
  4541.                                     }
  4542.                                     else
  4543.                                     {
  4544.                                         if(!CreateVarArgs(Result,Pkt,"%s.%s",DstName,FromIndex(Index + j,i,0,FALSE)))
  4545.                                         {
  4546.                                             Permit();
  4547.  
  4548.                                             break;
  4549.                                         }
  4550.                                     }
  4551.  
  4552.                                     Permit();
  4553.                                 }
  4554.  
  4555.                                 j++;
  4556.                             }
  4557.                             while(AttributeTable[Index + j] . Level > Level && !Results[0]);
  4558.                         }
  4559.  
  4560.                         while(AttributeTable[Index + 1] . Level > Level)
  4561.                             Index++;
  4562.  
  4563.                         Min = 0;
  4564.  
  4565.                         if(Results[0])
  4566.                             break;
  4567.                     }
  4568.  
  4569.                     Index++;
  4570.                 }
  4571.                 while(Index < AttributeTableSize && AttributeTable[Index] . Level > Level);
  4572.             }
  4573.         }
  4574.         else
  4575.         {
  4576.             STRPTR Result;
  4577.  
  4578.             if(Args[ARG_GETATTR_STEM])
  4579.                 SPrintf(DstName,"%s.%s",Args[ARG_GETATTR_STEM],SrcName);
  4580.             else
  4581.             {
  4582.                 if(Args[ARG_GETATTR_VAR])
  4583.                     strcpy(DstName,Args[ARG_GETATTR_VAR]);
  4584.                 else
  4585.                     DstName[0] = 0;
  4586.             }
  4587.  
  4588.             Forbid();
  4589.  
  4590.             if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  4591.                 Results[0] = RC_ERROR;
  4592.             else
  4593.             {
  4594.                 if(DstName[0])
  4595.                     CreateVar(Result,Pkt,DstName);
  4596.                 else
  4597.                 {
  4598.                     Permit();
  4599.  
  4600.                     return(CreateResult(Result,Results));
  4601.                 }
  4602.             }
  4603.  
  4604.             Permit();
  4605.         }
  4606.     }
  4607.  
  4608.     return(NULL);
  4609. }
  4610.  
  4611.     /* RexxSetAttr(struct RexxPkt *Pkt):
  4612.      *
  4613.      *    Set some global variable(s). Care to rewrite this beastie to
  4614.      *    work recursively?
  4615.      */
  4616.  
  4617. STRPTR
  4618. RexxSetAttr(struct RexxPkt *Pkt)
  4619. {
  4620.     enum    {    ARG_SETATTR_OBJECT,ARG_SETATTR_FIELD,ARG_SETATTR_STEM,
  4621.             ARG_SETATTR_VAR };
  4622.  
  4623.     UBYTE SrcName[160];
  4624.     WORD Index,Count1,Count2;
  4625.  
  4626.     if(Args[ARG_SETATTR_FIELD])
  4627.         SPrintf(SrcName,"%s.%s",Args[ARG_SETATTR_OBJECT],Args[ARG_SETATTR_FIELD]);
  4628.     else
  4629.         strcpy(SrcName,Args[ARG_SETATTR_OBJECT]);
  4630.  
  4631.     if((Index = ToIndex(SrcName,&Count1,&Count2)) == -1)
  4632.     {
  4633.         Results[0] = RC_ERROR;
  4634.         Results[1] = TERMERROR_UNKNOWN_OBJECT;
  4635.     }
  4636.     else
  4637.     {
  4638.         if(AttributeTable[Index] . ReadOnly)
  4639.         {
  4640.             Results[0] = RC_ERROR;
  4641.             Results[1] = TERMERROR_INFORMATION_IS_READ_ONLY;
  4642.         }
  4643.         else
  4644.         {
  4645.             UBYTE DstName[160];
  4646.  
  4647.             if(AttributeTable[Index] . Type == INFO_STEM)
  4648.             {
  4649.                 if(!Args[ARG_SETATTR_STEM])
  4650.                 {
  4651.                     Results[0] = RC_ERROR;
  4652.                     Results[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  4653.                 }
  4654.                 else
  4655.                 {
  4656.                     UBYTE    FullName[160];
  4657.                     STRPTR    Result;
  4658.                     LONG    Level,Max,Min = 0;
  4659.  
  4660.                     strcpy(DstName,Args[ARG_SETATTR_STEM]);
  4661.  
  4662.                     Level = AttributeTable[Index] . Level;
  4663.  
  4664.                     do
  4665.                     {
  4666.                         if(AttributeTable[Index] . Name)
  4667.                         {
  4668.                             if(!AttributeTable[Index + 1] . Name)
  4669.                             {
  4670.                                 if(AttributeTable[Index] . Type == INFO_STEM)
  4671.                                 {
  4672.                                         /* Special cases! */
  4673.  
  4674.                                     switch(AttributeTable[Index] . NodeID)
  4675.                                     {
  4676.                                         case ATTR_PREFS_TRANSLATIONS:
  4677.  
  4678.                                             Max = 256;
  4679.                                             break;
  4680.  
  4681.                                         case ATTR_PREFS_FUNCTIONKEYS:
  4682.                                         case ATTR_PREFS_FUNCTIONKEYS_SHIFT:
  4683.                                         case ATTR_PREFS_FUNCTIONKEYS_ALT:
  4684.                                         case ATTR_PREFS_FUNCTIONKEYS_CONTROL:
  4685.  
  4686.                                             Max = 11;
  4687.                                             Min = 1;
  4688.                                             break;
  4689.  
  4690.                                         default:
  4691.  
  4692.                                             Max = 0;
  4693.                                             break;
  4694.                                     }
  4695.                                 }
  4696.                                 else
  4697.                                     Max = 0;
  4698.  
  4699.                                 if(!Max)
  4700.                                 {
  4701.                                     Forbid();
  4702.  
  4703.                                     if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  4704.                                     {
  4705.                                         Permit();
  4706.  
  4707.                                         Results[0] = RC_ERROR;
  4708.  
  4709.                                         break;
  4710.                                     }
  4711.                                     else
  4712.                                         Max = Atol(Result);
  4713.  
  4714.                                     Permit();
  4715.                                 }
  4716.                             }
  4717.  
  4718.                             if(AttributeTable[Index] . Type != INFO_STEM)
  4719.                             {
  4720.                                 SPrintf(FullName,"%s.%s",DstName,FromIndex(Index,Count1,0,FALSE));
  4721.  
  4722.                                 if(!GetRexxVar(Pkt -> RexxMsg,FullName,&Result))
  4723.                                 {
  4724.                                     if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Result))
  4725.                                     {
  4726.                                         Results[0] = RC_ERROR;
  4727.  
  4728.                                         break;
  4729.                                     }
  4730.                                 }
  4731.                                 else
  4732.                                     Results[0] = RC_ERROR;
  4733.                             }
  4734.                         }
  4735.                         else
  4736.                         {
  4737.                             LONG i,j;
  4738.  
  4739.                             for(i = Min ; i < Max ; i++)
  4740.                             {
  4741.                                 j = 0;
  4742.  
  4743.                                 do
  4744.                                 {
  4745.                                     if(AttributeTable[Index + j] . Type != INFO_STEM)
  4746.                                     {
  4747.                                         SPrintf(FullName,"%s.%s",DstName,FromIndex(Index + j,i,0,FALSE));
  4748.  
  4749.                                         if(!GetRexxVar(Pkt -> RexxMsg,FullName,&Result))
  4750.                                         {
  4751.                                             if(Results[1] = SetSingleAttribute(AttributeTable[Index + j] . NodeID,Index + j,i,Result))
  4752.                                             {
  4753.                                                 Results[0] = RC_ERROR;
  4754.  
  4755.                                                 break;
  4756.                                             }
  4757.                                         }
  4758.                                         else
  4759.                                             Results[0] = RC_ERROR;
  4760.                                     }
  4761.  
  4762.                                     j++;
  4763.                                 }
  4764.                                 while(AttributeTable[Index + j] . Level > Level && !Results[0]);
  4765.                             }
  4766.  
  4767.                             while(AttributeTable[Index + 1] . Level > Level)
  4768.                                 Index++;
  4769.  
  4770.                             Min = 0;
  4771.  
  4772.                             if(Results[0])
  4773.                                 break;
  4774.                         }
  4775.  
  4776.                         Index++;
  4777.                     }
  4778.                     while(Index < AttributeTableSize && AttributeTable[Index] . Level > Level);
  4779.                 }
  4780.             }
  4781.             else
  4782.             {
  4783.                 STRPTR Result;
  4784.  
  4785.                 if(Args[ARG_SETATTR_STEM])
  4786.                 {
  4787.                     SPrintf(DstName,"%s.%s",Args[ARG_SETATTR_STEM],SrcName);
  4788.  
  4789.                     if(!GetRexxVar(Pkt -> RexxMsg,DstName,&Result))
  4790.                     {
  4791.                         if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Result))
  4792.                             Results[0] = RC_ERROR;
  4793.                     }
  4794.                     else
  4795.                         Results[0] = RC_ERROR;
  4796.                 }
  4797.                 else
  4798.                 {
  4799.                     if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Args[ARG_SETATTR_VAR]))
  4800.                         Results[0] = RC_ERROR;
  4801.                 }
  4802.             }
  4803.         }
  4804.     }
  4805.  
  4806.     return(NULL);
  4807. }
  4808.